Cakephp проверяет данные на объекте обновления

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