实体到数据映射/数组

时间:2018-07-18 07:01:57

标签: typo3 extbase

我有一个这样的实体:

class Company extends AbstractEntity
{
  /**
   * @var string
   */
  protected $longName = '';

  //much more properties

  //all the setters and getters
}

我想使用typo3核心中的DataHandler来保存这样的实体,因为保存该实体会触发整个工作区机制,从而将更新的对象/实体/行创建为新版本。 Extbase会直接绕过数据库直接写入数据库。

基本上,人们可以像这样使用api:

$data = [
  'long_name' => 'some very long Name'
];

$cmd = [];
$cmd['tablename_for_entity']['uid_of_entity'] = $data;

$dataHandler->start($cmd, []);
$dataHandler->process_datamap();

所以问题在于将实体变成»DataMap«或适当的数组。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

发生这种事情的原因是一种破解/解决方法,可以使用前端的工作区功能。这就绕过了数据库抽象层,该层非常好,只是触发了一些钩子。我希望将来的版本中不需要此功能,但现在,我可以使用以下解决方案解决该问题:

public function map(AbstractEntity $entity):array
{
  $result = [];

  $class = get_class($entity);

  /** @var ClassReflection $reflection */
  $reflection = GeneralUtility::makeInstance(ClassReflection::class, $class);

  /** @var DataMapper $mapper */
  $mapper = GeneralUtility::makeInstance(DataMapper::class);

  $dataMap = $mapper->getDataMap($class);

  foreach ($entity->_getProperties() as $property => $value) {
    $colMap = $dataMap->getColumnMap($property);
    $reflProp = $reflection->getProperty($property);

    if (!is_null($colMap) and $reflProp->isTaggedWith('maptce')) {
      $result[$colMap->getColumnName()] = $mapper->getPlainValue($value, $colMap);
    }
  }

  return $result;
}

这基本上可以做类似\TYPO3\CMS\Extbase\Persistence\Generic\Backend::persistObject()的事情,并且大多数代码也是从那里获取的。但是,到目前为止,一般的数据映射(尤其是用于嵌套实体等的数据映射)可能太复杂了,因此我决定仅测试属性是否具有@maptce批注以简化流程。

跳过某些属性是没有问题的,因为TCE process_datamap()方法会考虑到这一点。