Иногда вам нужно проверить значения, которые не привязаны ни к одной модели. Вы можете использовать класс yii \ base \ DynamicModel , который поддерживает определение атрибутов и правил на лету.
Шаг 1. Добавьте метод actionAdHocValidation в SiteController .
public function actionAdHocValidation() { $model = DynamicModel::validateData([ 'username' => 'John', 'email' => '[email protected]' ], [ [['username', 'email'], 'string', 'max' => 12], ['email', 'email'], ]); if ($model->hasErrors()) { var_dump($model->errors); } else { echo "success"; } }
В приведенном выше коде мы определяем «динамическую» модель с атрибутами username и email и проверяем их.
Шаг 2. В адресной строке веб-браузера введите http: // localhost: 8080 / index.php? R = site / ad-hoc-validation. Появится сообщение об ошибке, поскольку длина нашего электронного письма составляет 14 символов.
Пользовательские валидаторы
Существует два типа пользовательских валидаторов —
- Встроенные валидаторы
- Автономные валидаторы
Встроенный валидатор определяется методом модели или анонимной функцией. Если атрибут не проходит проверку, вы должны вызвать метод yii \ base \ Model :: addError (), чтобы сохранить сообщение об ошибке.
В следующем примере RegistrationForm проверяется свойство city, поэтому он может принимать только два значения — London и Paris.
<?php namespace app\models; use Yii; use yii\base\Model; class RegistrationForm extends Model { public $username; public $password; public $email; public $country; public $city; public $phone; public function rules() { return [ ['city', 'validateCity'] ]; } public function validateCity($attribute, $params) { if (!in_array($this->$attribute, ['Paris', 'London'])) { $this->addError($attribute, 'The city must be either "London" or "Paris".'); } } } ?>
Автономный валидатор расширяет класс yii \ validators \ Validator . Чтобы реализовать логику проверки, вы должны переопределить метод yii \ validators \ Validator :: validateAttribute () .
Шаг 1 — Чтобы реализовать предыдущий пример с использованием автономного валидатора, добавьте файл CityValidator.php в папку компонентов .
<?php namespace app\components; use yii\validators\Validator; class CityValidator extends Validator { public function validateAttribute($model, $attribute) { if (!in_array($model->$attribute, ['Paris', 'London'])) { $this->addError($model, $attribute, 'The city must be either "Paris" or "London".'); } } } ?>
Шаг 2 — Затем измените модель RegistrationForm таким образом.