如何在 PrePersist 生命周期上访问旧值原则中的回调2.


How to access old values on PrePersist LifecycleCallback in Doctrine2

我在 Doctrine2 中有一个实体,并将 HasLivecycleCallbacks 与 PrePersist 一起使用。一般来说,这工作正常,但我想只在我的实体中的某些字段发生变化时更改版本。我有机会获得旧的价值观吗?还是只是已更改的密钥?

/**
 * @ORM'HasLifecycleCallbacks
 */
class Person {

    /**
     * @PrePersist
     * @PreUpdate
     */
    public function increaseVersion() {

            if ( $this->version == null ) {
                $this->version = 0;
            }
            // only do this, when a certain attribute changed
            $this->version++;
    }
}

这取决于我们正在谈论的生命周期事件。预持久和预更新是不同的事件。

更新是在实体更新之前触发的。这将为您提供一个PreUpdateEventArgs对象,这是一个扩展的LifecycleEventArgs对象。这将允许您查询更改的字段,并允许您访问旧值和新值:

if ($event->hasChangedField('foo')) {
    $oldValue = $event->getOldValue('foo');
    $newValue = $event->getNewValue('foo');
}

您还可以通过 getEntityChangeSet() 获取所有更改的字段值,这将为您提供如下所示的数组:

array(
    'foo' => array(
        0 => 'oldValue',
        1 => 'newValue'
    ),
    // more changed fields (if any) …
)

另一方面,PrePersist假定一个新的实体(想想插入新行)。在 PrePersist 中,您将获得一个只能访问实体和EntityManagerLifecycleEventArgs对象。从理论上讲,您可以通过EntityManager访问UnitOfWork(跟踪对实体的所有更改),因此您可以尝试这样做

$changeSet = $event->getEntityManager()->getUnitOfWork()->getEntityChangeSet(
    $event->getEntity()
);

以获取要持久化实体的更改。然后,您可以检查此数组中是否有更改的字段。但是,由于我们谈论的是插入而不是更新,因此我假设所有字段都将被视为"已更改",并且旧值可能全部为空。我不确定,这会根据您的需要工作。

进一步参考:http://docs.doctrine-project.org/en/2.0.x/reference/events.html