1

我试图找出实体的哪些属性已更改。据我所知,有一个 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");
}

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

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

4

1 回答 1

0

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

使用原则,您需要从“UnitOfWork”中获取实体变更集,您可以从注入的 \Doctrine\Common\Persistence\ObjectManager 中获取。另请参阅是否有内置方法来获取 Doctrine 2 实体中的所有更改/更新字段

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

于 2015-09-03T23:21:34.020 回答