【问题标题】:Entity to Datamap/Array实体到数据图/数组
【发布时间】:2018-12-25 23:47:01
【问题描述】:

我有一个这样的实体:

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« 或适当的数组。

我该怎么做?

【问题讨论】:

  • 您还应该尝试解释为什么您打算使用DataHandler 而不是例如本机 Extbase 持久性。
  • 请看我的更新...

标签: typo3 extbase


【解决方案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() 方法会关心这些。

【讨论】:

  • 除了语句no Problem to skip some properties since the TCE process_datamap() method will care about that:注意数据库严格模式:如果属性在SQL模式定义中没有默认值,这将在插入记录时触发错误。可以通过在 TCA 中定义额外的 default 值来解决。更多详情请见stackoverflow.com/questions/40542151/…
  • 很高兴知道,谢谢。我对源代码的深入研究并没有那么深:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-06
  • 1970-01-01
  • 2016-11-05
  • 2017-12-22
  • 2019-08-31
  • 1970-01-01
相关资源
最近更新 更多