在Symfony 2.5 preUpdate
事件监听器中,我对是否/何时传入LifeCycleEventArgs
或PreUpdateEventArgs
(以及哪一个)感到困惑。
Doctrine Documentation表示从2.4开始使用LifeCycleEventArgs
:
从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
(如果您的版本中可用)将执行PreUpdateEventArgs
所做的所有操作以及更多内容吗?他们似乎都工作(即没有错误)。
使用新的LifeCycleEventArgs,是否仍然需要使用$entity->setNewValue('fieldName', $value)
? preUpdate仍然是限制性的,还是我们可以$entity->setFieldName($value)
?
答案 0 :(得分:1)
在Doctrine 2.2,class PreUpdateEventArgs extends LifecycleEventArgs
上,它只声明预更新实体的实体变更集。
所以是的,PreUpdateEventArgs
做得更多,虽然理论上(即我没有测试过!)你可以使用EM的UOW实现同样的目标:
LifecycleEventArgs
中,您可以使用getEntity()
访问已触发事件的实体。getEntityManager()
$this->getEntityManager()->getUnitOfWork()->getEntityChangeSet($this->getEntity())
应该为您提供与PreUpdateEventArgs
结论:PreUpdateEventArgs
促进了一项可以使用更多代码实现的工作;)
要深入了解:UnitOfWork::commit()
通过调用UnitOfWork::executeUpdates
来触发更新,PreUpdateEventArgs
调度一个$event->setNewValue('field', 'value')
实例,该实例填充了此实体的已计算变更集,直接取自UOW的改变集。 (同样:我使用2.2,你的发布可能会有所不同。)
关于$entity->setField('value')
与setNewValue
的关系,我相信您只需要更新变更集(computeChangeSets()
的工作)。直接调用实体的设置器可能会使实体与其在DB中的状态不同步,或者更可能是因为它不应该被考虑在内而无用。除非您手动拨打UOW的{{1}}。
希望这有帮助!