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(). Я подготовил слушателя и хотел использовать обратные вызовы модели, но я застрял, собирая исходные и измененные данные полей пользователей для сравнения


person T_Ix    schedule 27.11.2020    source источник


Ответы (1)


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

person mark    schedule 27.11.2020