Yii2: валидация, правила валидации, встроенные валидаторы

Частенько изобретаешь костыли, не зная, что разработчики Yii2 уже давно многое придумали и реализовали. А в случае с валидацией крайне рекомендую ознакомиться с документацией или хотя бы посмотреть код класса Validator, что в дальнейшем сэкономит кучу времени (проверено на личном опыте).

Итак, что же нужно знать о валидации:
  1. как задать правила валидации атрибутов модели
  2. сценарии валидации. Как отключить валидацию для сценария
  3. как изменить сообщения ошибок валидации
  4. как задать валидацию при выполнении определенного условия
  5. какие есть предопределенные валидаторы
  6. как создать свой валидатор
  7. как изменить данные перед или после валидации. События beforeValidate и afterValidate
Конечно, этими пунктами вопрос валидации не исчерпывается, но начнем с основ.

Как задать правила валидации атрибутов

Правила валидации задаются в методе rules:
public function rules()
{
    return [
        // поля model_id и number обязательны для заполнения
        [['model_id', 'number'], 'required'],

        // поле model_id должно быть целым числом
        [['model_id'], 'integer'],

        // максимальная длина поля number - 255 символов
        [['number'], 'string', 'max' => 255],

        // поле model_id должно быть существующей записью модели ItemModel, которая связана с текущей моделью по ключу model_id
        [['model_id'], 'exist', 'skipOnError' => true, 'targetClass' => ItemModel::className(), 'targetAttribute' => ['model_id' => 'id']],
    ];
}

Каждый элемент массива должен содержать:
  1. массив (и только массив) атрибутов, для которых должно применяться правило валидации;
  2. правило валидации. Это может быть:
    1. имя класса или псевдоним предопределенного валидатора (полный список можно посмотреть в документации);
    2. имя своего валидатора. Об этом будет ниже;
    3. имя метода модели;
  3. перечень дополнительных параметров, задающих ограничения или прочие условия валидации.

Сценарии валидации. Как отключить валидацию для сценария

По умолчанию любое правило валидации применимо ко всем сценариям. Но это можно изменить и задать:
  1. сценарии, для которых НУЖНО применять правило
    public function rules()
    {
        return [
            // для сценариев insert и update поле date обязательно
            [['date'], 'required', 'on' => [self::SCENARIO_INSERT, self::SCENARIO_UPDATE]],
    
            // для сценария presave поле date проверяется своим валидатором
            [['date'], 'availableDate', 'on' => self::SCENARIO_PRESAVE],
        ];
    }
    
  2. сценарии, для которыех НЕ НУЖНО применять правило (то есть исключить сценарии)
    public function rules()
    {
        return [
            // поле name будет обязательным во всех сценариях, кроме insert
            [['name'], 'required', 'except' => [self::SCENARIO_INSERT]],
        ];
    }
    

Как изменить сообщения ошибок валидации

При ошибках валидации предопределенные валидаторы возвращают свои сообщения. Если по какой-то причине они вас не устраивают, и вам нужно их изменить, то можно определить параметр message в правиле валидации.
public function rules()
{
    return [
        ['name', 'required', 'message' => 'Пожалуйста, заполните поле "Имя".'],
    ];
}

Как задать валидацию при выполнении определенного условия

Если валидация должна выполняться не всегда и не просто в сравнении с каким-то одним атрибутом, а при выполнении нескольких условий, то необходимо использовать параметр when
public function rules()
{
    return [
        [['number'], 'availableNumber', 'when' => function ($model) {return !empty($model->date) && !empty($model->section_id);}],
    ];
}
Этот параметр принимает функцию:
/**
 * @param Model $model модель, используемая для проверки
 * @param string $attribute атрибут для проверки
 * @return bool применять ли правило
 */
function ($model, $attribute)

Встроенные валидаторы Yii2

Что-то мне подсказывает, что вы не знакомы и с половиной этого списка. Ниже я представила только список встроенных валидаторов Yii2, примеры и описание каждого валидатора с его параметрами скоро будут в отдельном посте.
  • Валидация на типы данных

    • boolean
    • number
    • integer
    • double
    • string
  • Валидация даты и времени

    • date
    • datetime
    • time
  • Валидация массивов

    • each
  • Обязательное для заполнения поле

    • required
  • Проверка на существование

    • exist
  • Проверка на уникальность

    • unique
  • Проверка строк на соответствие регулярным выражениям или наборам данных

    • email
    • url
    • ip
    • match
    • in
  • Сравнение значений двух атрибутов

    • compare
  • Каптча

    • captcha
  • Валидация файлов

    • file
    • image

Валидаторы, которые не валидаторы

А что, такое бывает? :) Да, есть несколько валидаторов, которые на самом деле являются обработчиками данных:
  • default – задание значения по умолчанию;
  • filter – обрабатывает значение атрибута и присваивает ему новое значение. Обработка осуществляется в callback-функции, которая на вход принимает текущее значение атрибута, или же в любой другой функции, переданной в параметре filter;
  • trim – это валидатор filter с параметром 'filter' => 'trim'.

Как создать свой валидатор

Об этом читайте в посте "Yii2: свой валидатор".

Как изменить данные перед или после валидации. События beforeValidate и afterValidate

Выше уже писала, что данные можно изменить, используя валидатор filter. Но если необходимо описать условия изменения, а также отменить валидацию при определенных условиях, то нам нужны методы beforeValidate и afterValidate.

  • Метод beforeValidate вызывается до валидации. Этот метод должен вернуть true/false, что будет означать, нужно ли продолжать валидацию или нет. В этом методе можно подготовить данные для валидации, например, отформатировать атрибуты даты/времени в соответствии с нужным форматом.
  • Метод afterValidate вызывается после валидации. В нем можно выполнить обратное форматирование данных или другие манипуляции с данными.



Надеюсь, этот пост был полезен :)
Посты по теме:
Yii2: встроенные валидаторы. Описание, параметры
Yii2. Свой валидатор

Комментарии

Популярные сообщения