typo3 流在模型上是脏的

typo3 flow isDirty on model

我正在尝试找出某个实体的哪些属性已更改。 据我所知,有一个 PersistenceSession,它有一个方法来检查对象的属性是否为脏。但它总是正确的,因为它从不注册旧对象。

因此,如果我从 QuickGuide 获取演示并覆盖 CoffeeBeanRepository 中的更新方法:

/**
 * @param \Acme\Demo\Domain\Model\CoffeeBean $coffeeBean
 */
public function update($coffeeBean) {
    \TYPO3\Flow\var_dump($this->persistenceSession->isDirty($coffeeBean, 'name'), "name changed before");
    parent::update($coffeeBean);
    \TYPO3\Flow\var_dump($this->persistenceSession->isDirty($coffeeBean, 'name'), "name changed after");
}

...它总是正确的(两者),尽管我没有改变任何东西。

任何人 idea/reference 如何做到这一点? 我将它用于 REST API,其中用户无法更新多个字段,并且在编辑某些字段时必须执行其他操作。

persistenceSession 是 Fl​​ow 的通用持久性后端的一部分,除非您明确停用学说,否则既不会维护也不会真正使用。因此 persistenceSession 不会帮助你,因为正如你所注意到的,所有实体都被认为是 persistenceSession 的新实体。

使用学说,您需要从 "UnitOfWork" 中获取实体变更集,您可以从注入的 \Doctrine\Common\Persistence\ObjectManager 中获取实体变更集。另见 Is there a built-in way to get all of the changed/updated fields in a Doctrine 2 entity

但是,这是一个次优的解决方案,充其量只是一个棘手的变通办法。如果您需要跟踪对实体的更改,它应该是域模型的显式部分。例如,当给定值与当前值不同时,让您的设置器记录更改的属性列表。 完成后,您甚至可以在途中优化学说更改跟踪:http://doctrine-orm.readthedocs.org/en/latest/reference/change-tracking-policies.html#notify