在Symfony 2.5预更新事件侦听器中使用的正确生命周期事件目标是什么

在Symfony 2.5预更新事件侦听器中使用的正确生命周期事件目标是什么,symfony,doctrine-orm,Symfony,Doctrine Orm,在Symfony 2.5preUpdate事件侦听器中,我不知道是/何时传入LifeCycleEventArgs还是PreUpdateEventArgs(以及哪一个) 说明从2.4开始使用LifeCycleEventArgs: class User { public function preUpdate(PreUpdateEventArgs $event) { if ($event->hasChangedField('username')) {

在Symfony 2.5
preUpdate
事件侦听器中,我不知道是/何时传入
LifeCycleEventArgs
还是
PreUpdateEventArgs
(以及哪一个)

说明从2.4开始使用
LifeCycleEventArgs

class User
{
    public function preUpdate(PreUpdateEventArgs $event)
    {
        if ($event->hasChangedField('username')) {
            // Do something when the username is changed.
        }
    }
}
从2.4开始,触发的事件被赋予生命周期回调。具有 您可以访问EntityManager和 这些回调方法中的UnitOfWork API

但下面的示例和所有后续示例显示了
PreUpdateEventArgs

class User
{
    public function preUpdate(PreUpdateEventArgs $event)
    {
        if ($event->hasChangedField('username')) {
            // Do something when the username is changed.
        }
    }
}
那么这是否意味着
LifeCycleEventArgs
(如果在您的版本中提供)将完成
preupdateeeventargs
所做的一切以及更多?它们似乎都有效(即没有错误)


使用新的生命周期eventargs,是否仍然需要使用
$entity->setNewValue('fieldName',$value)
?preUpdate仍然是限制性的还是我们可以只做
$entity->setFieldName($value)

在原则2.2上,
类preupdateeEventArgs扩展了生命周期eEventArgs
,它只声明了被预更新实体的实体变更集。 是的,
PreUpdateEventArgs
做得更多,尽管理论上(即我没有测试!)您可以使用EM的UOW实现同样的效果:

  • LifecycleEventArgs
    中,您可以使用
    getEntity()
    访问触发事件的实体
  • 同一个类,您可以使用
    getEntityManager()访问EM
  • 因此:
    $this->getEntityManager()->getUnitOfWork()->getEntityChangeSet($this->getEntity())
    应该为您提供与
    PreUpdateEventArgs提供的更改集相同的更改集
  • 结论:
    PreUpdateEventArgs
    有助于完成一项已经可以使用稍微多一些代码完成的工作;)

    再深入一点:
    UnitOfWork::commit()
    通过调用
    UnitOfWork::executeUpdates
    触发更新,它调度一个
    PreUpdateEventArgs
    实例,该实例中填充了该实体的已计算变更集,直接取自UOW的变更集。(再说一次:我使用的是2.2,在您的版本中可能会有所不同。)

    关于
    $event->setNewValue('field','value')
    $entity->setField('value')
    ,我认为您只需要更新变更集(这是
    setNewValue
    的工作)。直接调用实体的setter可能会将实体从其在DB中的状态取消同步,或者更可能是无用的,因为不应该考虑它。除非您手动调用UOW的
    computeChangeSets()


    希望这有帮助

    在原则2.2中,
    类preupdateeEventArgs扩展了生命周期eEventArgs
    ,它只声明被预更新实体的实体变更集。 是的,
    PreUpdateEventArgs
    做得更多,尽管理论上(即我没有测试!)您可以使用EM的UOW实现同样的效果:

  • LifecycleEventArgs
    中,您可以使用
    getEntity()
    访问触发事件的实体
  • 同一个类,您可以使用
    getEntityManager()访问EM
  • 因此:
    $this->getEntityManager()->getUnitOfWork()->getEntityChangeSet($this->getEntity())
    应该为您提供与
    PreUpdateEventArgs提供的更改集相同的更改集
  • 结论:
    PreUpdateEventArgs
    有助于完成一项已经可以使用稍微多一些代码完成的工作;)

    再深入一点:
    UnitOfWork::commit()
    通过调用
    UnitOfWork::executeUpdates
    触发更新,它调度一个
    PreUpdateEventArgs
    实例,该实例中填充了该实体的已计算变更集,直接取自UOW的变更集。(再说一次:我使用的是2.2,在您的版本中可能会有所不同。)

    关于
    $event->setNewValue('field','value')
    $entity->setField('value')
    ,我认为您只需要更新变更集(这是
    setNewValue
    的工作)。直接调用实体的setter可能会将实体从其在DB中的状态取消同步,或者更可能是无用的,因为不应该考虑它。除非您手动调用UOW的
    computeChangeSets()


    希望这有帮助

    在原则2.2中,
    类preupdateeEventArgs扩展了生命周期eEventArgs
    ,它只声明被预更新实体的实体变更集。 是的,
    PreUpdateEventArgs
    做得更多,尽管理论上(即我没有测试!)您可以使用EM的UOW实现同样的效果:

  • LifecycleEventArgs
    中,您可以使用
    getEntity()
    访问触发事件的实体
  • 同一个类,您可以使用
    getEntityManager()访问EM
  • 因此:
    $this->getEntityManager()->getUnitOfWork()->getEntityChangeSet($this->getEntity())
    应该为您提供与
    PreUpdateEventArgs提供的更改集相同的更改集
  • 结论:
    PreUpdateEventArgs
    有助于完成一项已经可以使用稍微多一些代码完成的工作;)

    再深入一点:
    UnitOfWork::commit()
    通过调用
    UnitOfWork::executeUpdates
    触发更新,它调度一个
    PreUpdateEventArgs
    实例,该实例中填充了该实体的已计算变更集,直接取自UOW的变更集。(再说一次:我使用的是2.2,在您的版本中可能会有所不同。)

    关于
    $event->setNewValue('field','value')
    $entity->setField('value')
    ,我认为您只需要更新变更集(这是
    setNewValue
    的工作)。直接调用实体的setter可能会将实体从其在DB或JU中的状态取消同步