CakePHP 2.x сравнивает исходные и измененные данные при сохранении модели

#events #cakephp #model #listener #cakephp-2.x

#Мероприятия #cakephp #Модель #прослушиватель #cakephp-2.x

Вопрос:

Я работаю над решением для хранения информации в базе данных, если определенные данные были изменены. В CakePHP 3.x я реализовал прослушиватель для события Model.beforeSave. Когда пользовательская модель была сохранена, я сравниваю ее, собирая грязные (измененные) поля, и дополнительно проверяю, действительно ли изменилось значение полей.

Пример:

 class CustomListener implements EventListenerInterface {

  public function implementedEvents() {
      return [
          'Model.beforeSave' => [
              'priority' => 600,
              'callable' => 'filterUserInfos',
          ],

      ];
  }

  public function filterUserInfos($event, $entity, $options) {
      $subject = $event->getSubject();
      if($subject->alias() == 'Users') {

          $modified_fields = array_flip($entity->getDirty());
          $observed_fields = [
            'firstname',
            'lastname',
            'email',
            'country_id',
            'language_id',
          ];
         
         // look if modified fields are in my observed list
         $matches = array_intersect_key($modified_fields, array_flip($observed_fields));
        
         if(!empty($matches)) {
            // if its dirty but its value didn't change... throw away
            foreach(array_keys($matches) as $attribute) {
                if($entity->$attribute == $entity->getOriginal($attribute)) {
                    unset($matches[$attribute]);
                }
            }
            if(!empty($matches)) {
               // call function to store to database
            }
         }
       }
    return true;
  } 
}
 

Теперь мне нужно выполнить аналогичную задачу на CakePHP 2.x, где модель не имеет одинаковых функций getDirty() и getOriginal(). Я подготовил прослушиватель и хотел использовать обратные вызовы модели, но я застрял, собирая исходные и измененные данные полей пользователей для сравнения

Ответ №1:

Вы можете проверить удивительный список о том, как это делают такие поведения, как Logable. Обычно они делают снимок данных перед сохранением и сравнивают его с данными после сохранения. Немного более ручной процесс для массивов, чем с классами сущностей 3.x .