Учебники

Yii — специальная проверка

Иногда вам нужно проверить значения, которые не привязаны ни к одной модели. Вы можете использовать класс 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 таким образом.