在Symfony 2.5预更新事件侦听器中使用的正确生命周期事件目标是什么
在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')) {
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中的状态取消同步