#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 .