答案 0 :(得分:12)
这个问题与this one
有点类似您的解决方案只是将旧对象的字段与新对象进行比较,并查看它的不同之处。
例如:
public function preUpdate($newObject)
{
$em = $this->getModelManager()->getEntityManager($this->getClass());
$originalObject = $em->getUnitOfWork()->getOriginalEntityData($newObject);
if ($newObject->getSomeField() !== $originalObject['fieldName']) {
// Field has been changed
}
}
答案 1 :(得分:1)
对我而言,最好的方法是在Sonata Admin:
$newField = $this->getForm()->get('field')->getData();
$oldField = $this->getForm()->get('field')->getConfig()->getData();
除非没有选择,否则不应使用工作单元。此外,如果您有一个未映射的字段,则无法通过实体对象访问它。
在正常的Doctrine lyfe循环事件中,最佳选择是Doctrine preupdate event doc