Yii2: валидация, правила валидации, встроенные валидаторы
Частенько изобретаешь костыли, не зная, что разработчики Yii2 уже давно многое придумали и реализовали. А в случае с валидацией крайне рекомендую ознакомиться с документацией или хотя бы посмотреть код класса Validator, что в дальнейшем сэкономит кучу времени (проверено на личном опыте).
Итак, что же нужно знать о валидации:
Каждый элемент массива должен содержать:
Надеюсь, этот пост был полезен :)
Итак, что же нужно знать о валидации:
- как задать правила валидации атрибутов модели
- сценарии валидации. Как отключить валидацию для сценария
- как изменить сообщения ошибок валидации
- как задать валидацию при выполнении определенного условия
- какие есть предопределенные валидаторы
- как создать свой валидатор
- как изменить данные перед или после валидации. События 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']],
];
}
Каждый элемент массива должен содержать:
- массив (и только массив) атрибутов, для которых должно применяться правило валидации;
- правило валидации. Это может быть:
- имя класса или псевдоним предопределенного валидатора (полный список можно посмотреть в документации);
- имя своего валидатора. Об этом будет ниже;
- имя метода модели;
- перечень дополнительных параметров, задающих ограничения или прочие условия валидации.
Сценарии валидации. Как отключить валидацию для сценария
По умолчанию любое правило валидации применимо ко всем сценариям. Но это можно изменить и задать:- сценарии, для которых НУЖНО применять правило
public function rules() { return [ // для сценариев insert и update поле date обязательно [['date'], 'required', 'on' => [self::SCENARIO_INSERT, self::SCENARIO_UPDATE]], // для сценария presave поле date проверяется своим валидатором [['date'], 'availableDate', 'on' => self::SCENARIO_PRESAVE], ]; }
- сценарии, для которыех НЕ НУЖНО применять правило (то есть исключить сценарии)
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
Проверка строк на соответствие регулярным выражениям или наборам данных
- 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. Свой валидатор
Комментарии
Отправить комментарий