什么是在Symfony 2.5 preUpdate事件监听器中使用的正确LifeCycleEventArgs

时间:2014-10-13 19:07:57

标签: symfony doctrine-orm

在Symfony 2.5 preUpdate事件监听器中,我对是否/何时传入LifeCycleEventArgsPreUpdateEventArgs(以及哪一个)感到困惑。

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)

1 个答案:

答案 0 :(得分:1)

在Doctrine 2.2,class PreUpdateEventArgs extends LifecycleEventArgs上,它只声明预更新实体的实体变更集。 所以是的,PreUpdateEventArgs做得更多,虽然理论上(即我没有测试过!)你可以使用EM的UOW实现同样的目标:

  1. LifecycleEventArgs中,您可以使用getEntity()访问已触发事件的实体。
  2. 同一类,您可以使用getEntityManager()
  3. 访问EM
  4. 因此:$this->getEntityManager()->getUnitOfWork()->getEntityChangeSet($this->getEntity())应该为您提供与PreUpdateEventArgs
  5. 提供的变更集相同的变更集

    结论:PreUpdateEventArgs促进了一项可以使用更多代码实现的工作;)

    要深入了解:UnitOfWork::commit()通过调用UnitOfWork::executeUpdates来触发更新,PreUpdateEventArgs调度一个$event->setNewValue('field', 'value')实例,该实例填充了此实体的已计算变更集,直接取自UOW的改变集。 (同样:我使用2.2,你的发布可能会有所不同。)

    关于$entity->setField('value')setNewValue的关系,我相信您只需要更新变更集(computeChangeSets()的工作)。直接调用实体的设置器可能会使实体与其在DB中的状态不同步,或者更可能是因为它不应该被考虑在内而无用。除非您手动拨打UOW的{{1}}。

    希望这有帮助!