Правила валидации форм в Yii 2.x

После ввода данных в форму на сайте, мы проверяем правильность введенных данных. Это понятие носит название валидации. В Yii 2.x мы можем проверить валидность с помощью метода yii\base\Model::validate().

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

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

// объявляем экземпляр класса
$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'],
    ];
}