Как в Yii2 настроить правило валидации Unique, чтоб оно работало корректно?

Есть форма из трех полей. Модель представлена ниже.
<?php

namespace app\models;

use Yii;
use yii\db\ActiveRecord;

class Add extends ActiveRecord
{
    const PERMISSIONS_PRIVATE = 10;
    const PERMISSIONS_PUBLIC = 20;

    public $name;
    public $login;
    public $password;
    private $connection;
    
    public function __construct()
    {
        $this->connection = Yii::$app->db;   
    }
    
    public static function tableName(){
        return 'users';
    }
    
    public function rules()
    {
        return [
            [['name','login','password'], 'required'],
            [['login'], 'email'],
            [['login'], 'unique'],
        ];
    }
}


Правила валидации: все поля обязательны для заполнения, в поле "Логин" должен быть введен e-mail, также в поле "Логин" должно быть введено уникальное значение, не существующее в колонке "login" таблицы "users".

Суть проблемы:
Если метод rules() оставить таким, каким он есть выше, а из полей формы заполнить только одно поле Логин валидным e-mail, но невалидным по уникальности, отправить форму, то поля "Name" и "Password" подсветятся красным и возле них выведутся сообщения о невалидности данных. При этом, значение в поле "Логин" отображается, как валидное (хоть и не является уникальным).
Если в методе rules() убрать абсолютно все правила валидации, кроме уникальности логина, а форму отправить с теми же данными (только правильный, но не уникальный e-mail), то это правило сработает и юудет выведено сообщение о том, что такой логин уже существует.
Итог:
Правило unique срабатывает только, когда оно является единственным правилом в методе rules()
Вопрос:
Почему так происходит и что нужно сделать, чтоб проверка уникальности срабатывала вместе с другими правилами?
  • Вопрос задан
  • 4422 просмотра
Решения вопроса 1
Правило unique не работает при клиентской валидации, но в доке об этом забыли упомянуть.
В данном случае, проще всего использовать ajax валидацию поля login:
1. В представлении включить валидацию для поля
$form->field($model, 'login', ['enableAjaxValidation' => true]);

2. В контроллере create/update отдать ошибки валидации
if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
    Yii::$app->response->format = Response::FORMAT_JSON;
    return ActiveForm::validate($model);
}


В исходном примере, если ввести корректные имя и пароль и корректный, но не уникальный логин и отправить форму, она вернется с ошибкой валидации не уникального логина. Все работает и срабатывает;)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы