Как узнать, изменились ли значения модели laravel при сохранении обратного вызова

после этого ответа, я делаю модель save callbacks (аналогично рельсам) в Laravel так:

class LessonPlan extends Eloquent {

   public function save(array $options = array())
   {
      // before save code 
      parent::save();
      // after save code
   }
}

Однако я вызываю save() в Page, когда я сохраняю новую страницу или обновляю существующую. Как узнать, что именно в этой операции?

Я пробовал что-то вроде

public function save(array $options = array())
{
    // before save code
    $oldLesson = clone $this;
    parent::save();

    ..
    if ($this->isLessonStatusChanged($oldLesson)) {
      ..
    }
}

private function isLessonStatusChanged($oldLesson) {
    return $this->status != $oldLesson->status;
}

но это не хорошо.. поскольку $oldLesson уже будет иметь новые значения $lesson

то, что я закончил делать, просто переименовал URL-адрес, чтобы увидеть, если это запрос на обновление.. но у меня уже есть проблемы с ночным сном (мой ответ на самом деле не говорит мне, изменились ли какие-либо значения. b/c можно подать форму обновления без фактического изменения чего-либо).. есть ли более чистый способ сделать это?

Ответ 1

Вы можете использовать метод isDirty(), который возвращает bool и getDirty(), который возвращает array с измененными значениями.

public function save(array $options = array())
{
    $changed = $this->isDirty() ? $this->getDirty() : false;

    // before save code
     parent::save();

    // Do stuff here
    if($changed)
    {
        foreach($changed as $attr)
        {
            // My logic
        }
    }

}

Ответ 2

Вы пробовали Model::getDirty()? Я сам не пробовал, но он возвращает атрибуты, которые были изменены с момента последней синхронизации. См. документы API.