Doctrine listener – запуск действия только при изменении поля

Как проверить, изменилось ли поле?

Я хотел бы вызвать действие в preSave() только если определенное поле изменилось, eq

 public function preSave() { if ($bodyBefore != $bodyNow) { $this->html = $this->_htmlify($bodyNow); } } 

Вопрос в том, как получить это $bodyBefore и $bodyNow

Не загружайте базу данных еще раз! Это работает для Doctrine 1.2, я не тестировал более низкие версии.

 // in your model class public function preSave($event) { if (!$this->isModified()) return; $modifiedFields = $this->getModified(); if (array_key_exists('title', $modifiedFields)) { // your code } } 

Проверьте документацию .

Ответ Тревиса был почти прав, потому что проблема в том, что объект перезаписывается, когда вы выполняете запрос Doctrine. Таким образом, решение:

 public function preSave($event) { // Change the attribute to not overwrite the object $oDoctrineManager = Doctrine_Manager::getInstance(); $oDoctrineManager->setAttribute(Doctrine::ATTR_HYDRATE_OVERWRITE, false); $newRecord = $event->getInvoker(); $oldRecord = $this->getTable()->find($id); if ($oldRecord['title'] != $newRecord->title) { ... } } 

Попробуйте это.

 public function preSave($event) { $id = $event->getInvoker()->id; $currentRecord = $this->getTable()->find($id); if ($currentRecord->body != $event->getInvoker()->body) { $event->getEnvoker()->body = $this->_htmlify($event->getEnvoker()->body); } }