#php #cakephp #model-view-controller #orm
#php #cakephp #модель-представление-контроллер #orm
Вопрос:
Я не могу заставить проверку работать должным образом при обновлении данных объекта. Проверка не работает после изменения исходных данных. Приведенный ниже код предоставляет пример:
// in controller
$user = $this->Users->newEntity([
'mail' => 'wrong',
'password' => 'password',
'auth_level' => 0,
]);
debug($user->getErrors()); // Will show error: wrong email format
$user->mail = "correct@correct.correct";
debug($user->getErrors()); // Will show no errors
$user->mail = "wrong";
debug($user->getErrors()); //Will show no errors
if (TableRegistry::get('users')->save($user)) {
// This actually executes
}
Мое правило проверки в модели выглядит следующим образом:
public function validationDefault(Validator $validator): Validator
{
$validator
->email('mail')
->add('mail', 'unique',
[
'on' => ['create', 'update'],
'rule' => 'validateUnique',
'provider' => 'table',
'message' => "Email already in use"
]
);
return $validator
}
Я пытался создавать правила с помощью «on»=> «update», но это не помогает.
Чего я пытаюсь добиться, так это получить объект, изменить адрес электронной почты и сохранить его обратно в базу данных. При сохранении поле электронной почты не проверяется ни на формат, ни на уникальность.
Ответ №1:
Для полноты картины.
Существует разница между правилами приложения и правилами проверки.
Правила проверки проверяют данные, обычно поступающие из пользовательского ввода (newEntity(), patchEntity()). Объект восстанавливается. Запеченные данные находятся в функции «validationDefault» внутри таблиц.
Правила приложения устанавливают некоторые правила для данных, измененных в коде приложения, которые, как ожидается, будут «безопасными» (установщики). Объект не восстанавливается. Запеченные находятся в функции «buildRules» внутри таблиц.
функция «save ()» будет проходить не через правила проверки, а через правила приложения.
При сохранении данных, которые должны проходить через правила проверки, потому что они назначены / установлены в приложении, но это данные, поступающие с пользовательского ввода, убедитесь, что вы используете patchEntity() .
Дополнительная информация: https://github.com/cakephp/cakephp/issues/6654
Ответ №2:
Решение состоит в том, чтобы всегда обновлять данные объекта с помощью
$model->patchEntity($entity, $newdata)