Программирование, веб-кодинг

Правила валидации форм в Yii2

Проверка полей в формах

Правила валидации форм в Yii2

В Yii2 данные в полях формы проверяются на валидность с помощью метода yii\base\Model::validate().

Перед такой проверкой на валидность методом validate(), мы должны в модели каждому атрибуту назначить правила валидации. Каждое правило представляет собой массив. У поля должно быть хотя бы 1 правило валидации

Рассмотрим пример проверки на валидность формы:

// объявляем экземпляр класса
$model = new \app\models\ContactForm;
// модель заполненная пользовательскими данными
$model->attributes = \Yii::$app->request->post('ContactForm');
if ($model->validate()) {
// все данные корректны
} else {
// данные не корректны: $errors - массив содержащий сообщения об ошибках
$errors = $model->errors;
}

Пример взят из официальной документации, он осуществляет проверку массива, полученного POST запросом из формы.

Для того чтобы метод validate() работал, в модели мы должны объявить правила валидации для каждого атрибута формы. Рассмотрим несколько примеров правил

Валидация по типу данных

public function rules(){
return [
// переменная может быть только целочисленным числом
[ ['count'],'integer'],
// число с плавающей точкой
[ ['temperature'],'double'],
// логическая переменная (true или false)
[ ['check'],'boolean'],
// число
[ ['age'],'number'],
// строка
[ ['name'],'string'],
// дата (формат 12.12.15)
[ ['today'],'date', 'format'=>'dd-mm-yy'],
];
}

Поле обязательно к заполнению

public function rules(){
return [
//поля имя, эл. адрес, телефон, адрес обязательны к заполнению
[ ['name', 'email', 'phone','address'], 'required'],
];
}

Email, ссылка и капча

public function rules(){
return [
['homemail','email'],
['website', 'url', 'defaultScheme' => 'http'],
['verificationCode', 'captcha'],
];
}

Максимальное, минимальное значение и длина строки

public function rules(){
return [
// минимальная длинна строки 100 символов
[ ['minstring'],'string','min'=>100],
// максимальная длинна строки 1000 символов
[ ['maxstring'],'string','max'=>1000],
// длинна варьируется от 5 до 10 символов
[ ['string'],'string','min'=>5,'max'=>10],
// второй способ
[ ['lengthstring]', 'string', 'length' => [5, 10]],
// аналогично с числами
[ ['minnumber'],'number','min'=>100],
[ ['maxnumber'],'number','max'=>1000],
[ ['betweennumber'],'number','min'=>5,'max'=>10],
];
}

Проверка типа файла

public function rules(){
return [
//обязательно изображение
[ ['picture'],'image'],
// документ только doc или docx
[ ['document'],'file','types'=>['doc','doсx']],
// документ определенного формата размером не больше 1 Кб
['blank', 'file', 'extensions' => ['pdf', 'doc', 'djvu'],
'maxSize' => 1024*1024],
// изображение определенного формата и определенных размеров
['myimage', 'image', 'extensions' => 'png, jpg, gif',
'minWidth' => 1000, 'maxWidth' => 2000,
'minHeight' => 1000, 'maxHeight' =>2000,
],
];
}

Валидация по уникальности

public function rules(){
return [
// name должен быть уникальным в столбце
['name', 'unique'],
// mail должен быть уникальным, но для проверки на уникальность
// будет использован столбец secondmail
['mail', 'unique', 'targetAttribute' => 'secondmail'],
// name и email вместе должны быть уникальны, и каждый из них
// будет получать сообщения об ошибке
[ ['name', 'email'], 'unique', 'targetAttribute' => ['name', 'email']],
// name и email вместе должны быть уникальны, но только name будет получать сообщение об ошибке
['name', 'unique', 'targetAttribute' => ['name', 'email']],
// name должен быть уникальным, что устанавливается проверкой уникальности email и secondmail используя name
['name', 'unique', 'targetAttribute' => ['email', 'name' => 'secondemail']],
];
}

Валидация существования

public function rules(){
return [
// name должно существовать в столбце, который представляется атрибутом "name"
['name', 'exist'],
// name должно существовать, но его значение будет использовать email для проверки существования
['name', 'exist', 'targetAttribute' => 'email'],
// и name, и email должны существовать, в противном случае оба атрибута будут возвращать ошибку
,
// и name, и email должны существовать, но только атрибут name будет возвращать ошибку
['name', 'exist', 'targetAttribute' => ['name', 'email']],
// name требует проверки существования email и a3 (используя значение name)
['name', 'exist', 'targetAttribute' => ['email', 'name' => 'a3']],
// name должен существовать. Если name - массив, то каждый его элемент должен существовать
['name', 'exist', 'allowArray' => true],
];
}

Валидатор фильтр, валидатор не проверяет данные он выполняет определенные действия над атрибутами

public function rules(){
return [
//обрезаем пробелы строки с обоих сторон
[ ['name'],'filter','filter'=>'trim'],
// преобразуем регистр
[ ['address'],'filter','filter'=>'strtolower'],
['phone', 'filter', 'filter' => function ($value) {
// выполняем определенные действия с переменной, возвращаем преобразованную переменную
return newValue;
}],
];
}

Валидатор список

public function rules(){
return [
// номер от 5 до 20
['number', 'in','range'=>range(5,20)],
// язык либо английский, либо французский, либо русский, без учета типа данных, если true проверять тип данных
['language','in','range'=>['en','fr','ru']], ,'strict'=>false],
];
}

Валидатор сравнения, сравнивает одно значение с другим

public function rules(){
return [
// проверяет, является ли значение атрибута "password" таким же, как "password_repeat"
['password', 'compare'],
// проверяет, что возраст больше или равен 30
['age', 'compare', 'compareValue' => 30, 'operator' => '>='],
];
}

Валидатор по регулярному выражению

public function rules(){
return [
// проверяет, что "name" начинается с буквы и содержит только буквенные символы,
// числовые символы и знак подчеркивания
['name', 'match', 'pattern' => '/^[a-z]\w*$/i']
];
}

Валидатор присваивающий значение по умолчанию

public function rules(){
return [
// установить null для "age" в качестве значения по умолчанию
['age', 'default', 'value' => null],
// установить "USA" в качестве значения по умолчанию для "country"
['country', 'default', 'value' => 'USA'],
// установить в "from" и "to" дату 3 дня и 6 дней от сегодняшней, если они пустые
[ ['from', 'to'], 'default', 'value' => function ($model, $attribute) {
return date('Y-m-d', strtotime($attribute === 'to' ? '+3 days' : '+6 days'));
}],
];
}

Валидатор, указывающий безопасность атрибута

public function rules(){

return [

// обозначает "name" как safe атрибут
['name', 'safe'],

];

} 

По мотивам – http://www.webapplex.ru/pravila-validaczii-form-v-yii-2.x