2014-02-04 6 views

ответ

11

Этот вопрос немного похож на 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

Thx! Это было полезно. Но этот случай должен работать для mongoDB ('getOriginalDocumentData'), для mysql я использовал' getOriginalEntityData'. Кроме того, функция возвращает массив, поэтому мне пришлось ссылаться на '$ originalObject ['fieldName']'. Было бы здорово, если бы вы могли обновить свой ответ. – NHG

+0

Вы были правы, я исправил свой ответ. Рад, что смог помочь! –

+1

Отличный ответ, но есть ли способ сделать это с помощью postUpdate()? – vimuth

0

Для меня лучший подход это в Sonata Admin:

$newField = $this->getForm()->get('field')->getData(); 
$oldField = $this->getForm()->get('field')->getConfig()->getData(); 

Вы не должны использовать единицу работы, если нет никакой возможности. Кроме того, если у вас есть не отображаемое поле, вы не можете получить к нему доступ объектом объекта.

В нормальном случае доктрина Lyfe цикла, лучшим вариантом является Doctrine preupdate event doc

Смежные вопросы