我有一个这样的实体:
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«或适当的数组。
我该怎么做?
答案 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()
方法会考虑到这一点。