Если вы спрашиваете «Что такое Yii?», ознакомьтесь с моим предыдущим учебным пособием: Введение в Yii Framework, в котором рассматриваются преимущества Yii и которое включает обзор нового в Yii 2.0, выпущенного в октябре 2014 года.
В этом курсе Программирование с Yii2 я направляю читателей на использование недавно обновленного Yii2 Framework для PHP. В этом уроке я собираюсь познакомить вас с валидаторами Yii2. Валидаторы упрощают код, необходимый для проверки ввода, то есть проверяют соответствие или несоответствие ввода данных, как правило, от пользователей через веб-формы.
В этих примерах мы продолжим использование кодовой базы приложения Hello, которую мы использовали в прошлых уроках. Используйте ссылки GitHub на этой странице, чтобы получить код.
Просто напоминание, я участвую в ниже выведенных комментариях. Меня особенно интересует, если у вас есть дополнительные идеи или вы хотите предложить темы для будущих учебников. Вы также можете связаться со мной @reifman в Twitter.
Что такое Валидатор?
Если вы являетесь веб-разработчиком, вы, вероятно, знаете, что пользователю нельзя доверять. Например, пользователи могут использовать методы SQL-инъекций, чтобы попытаться запустить запросы, которые изменяют или раскрывают пароли. Кто-то однажды запустил SQL-инъекцию против установки PHPList с открытым исходным кодом и смог открыть один из моих паролей (PHPList сохранял их в виде обычного текста). Чаще всего вы просто хотите убедиться, что данные, которые пользователи предоставляют, соответствуют типам, формам и диапазонам вашего приложения.
Создание валидаторов в PHP вручную требует времени. Yii Framework предоставляет тонну базовых функций проверки, поэтому нет необходимости создавать их с нуля. Но, если вам нужны какие-то пользовательские расширения, это просто.
Валидации - еще одна причина, по которой я считаю, что всегда имеет смысл создавать приложения на веб-фреймворках, таких как Yii, а не на ванильном PHP.
В предыдущих эпизодах мы также много говорили о генераторе кода Yii - Gii. Одним из преимуществ Gii является то, что он напишет соответствующие правила проверки для ваших моделей на основе определений типа SQL в таблице. Это большая экономия времени.
Какие проверки поддерживает Yii?
Вот список встроенных валидаторов Yii и ссылки на документацию:
- BooleanValidator. Обеспечивает, что значение - true или false.
- CaptchaValidator. Проверяет поле проверки формы CAPTCHA.
- CompareValidator. Сравнивает два значения из формы или константы, например, x должно быть меньше 99.
- DateValidator. Обеспечивает, что значение - это дата.
- DefaultValueValidator. Не настоящий валидатор. Устанавливает значения по умолчанию для пустых полей.
- NumberValidator. Обеспечивает, что значение является числовым, например, integer или float.
- EmailValidator. Обеспечивает, что значение является действительным адресом электронной почты.
- ExistValidator. Обеспечивает, что значение существует в другой таблице.
- FileValidator. Обеспечивает наличие загруженного файла.
- FilterValidator. Не настоящий валидатор. Выполняет преобразование по предоставленному значению.
- ImageValidator. Проверяет изображение и свойства изображения.
- RangeValidator. Обеспечивает, чтобы значение находилось в списке значений.
- RegularExpressionValidator. Выполняет проверку с условием, определенным регулярным выражением.
- RequiredValidator. Обеспечивает наличие значения.
- SafeValidator. Не настоящий валидатор. Позволяет массивное присвоение отправленной веб-формы для включения атрибута. например $model->attributes = $_POST["Comment"];
- StringValidator. Обеспечивает, что значение - строка.
- UniqueValidator. Обеспечивает уникальное значение в таблице, например адрес электронной почты.
- UrlValidator. Обеспечивает, что значение в формате URL, например, http://yourdomain.com
Как работает валидация Yii
Вот как Yii описывает поток проверки. Как правило, вы можете использовать сценарий по умолчанию и не нужно создавать свои собственные. Обычно вам нужно полагаться на Gii, чтобы генерировать правила или писать свои собственные.
Когда вызывается метод validate()
, он делает следующие шаги для выполнения проверки:
- Определяет, какие атрибуты должны быть проверены путем получения списка атрибутов из yii\base\Model::scenarios() с использованием текущего сценария. Эти атрибуты называются активными атрибутами.
- Определяет, какие правила проверки следует использовать, получив список правил из yii\base\Model::rules(), используя текущий сценарий. Эти правила называются активными правилами.
- Использует каждое активное правило для проверки каждого активного атрибута, связанного с этим правилом. Правила проверки проверяются в том порядке, в котором они перечислены.
Согласно вышеуказанным шагам проверки атрибут будет проверяться, если и только если он является активным атрибутом, объявленным в scenarios()
и связан с одним или несколькими активными правилами, объявленными в rules()
.
Пример правил проверки модели
Вот как может выглядеть набор правил проверки модели. Я взял их из приложения Планировщик встреч, модель Place:
public function rules() { return [ [["name","slug"], "required"], [["place_type", "status", "created_by", "created_at", "updated_at"], "integer"], [["name", "google_place_id", "slug", "website", "full_address", "vicinity"], "string", "max" => 255], [["website"], "url"], [["slug"], "unique"], [["searchbox"], "unique","targetAttribute" => "google_place_id"], [["name", "full_address"], "unique", "targetAttribute" => ["name", "full_address"]], ]; }
По мере дальнейшего использования наших собственных примеров валидации вы узнаете, что представляет собой каждое из приведенных выше определений.
Пример отображения ошибок
Существует несколько способов доступа к ошибкам, возвращаемым валидацией.
Вот пример получения массива ошибок в контроллере:
$model = new \app\models\ContactForm;// populate model attributes with user inputs$model->attributes = \Yii::$app->request->post("ContactForm");if ($model->validate()) { // all inputs are valid} else { // validation failed: $errors is an array containing error messages $errors = $model->errors;}
И вот пример использования функции Yii errorSummary в ActiveForms:
<div class="meeting-place-form"> <?php $form = ActiveForm::begin(); ?> <?= $form->errorSummary($model); ?>
Вот как это выглядит:

Расширенная проверка
В последующих эпизодах я также приведу примеры использования расширенных функций проверки:
- Определение сценариев для выборочного применения правил для определенных ситуаций
- Определение пользовательских сообщений об ошибках
- События проверки для переопределения проверки или выполнения определенных функций до и/или после проверки
- Условная проверка для выполнения правила валидации только в том случае, если конкретное событие истинно
- Ad Hoc validation - для использования правил валидации независимо от отправки формы
- Пользовательские валидаторы - для создания важных валидаций за пределами того, что Yii предлагает из коробки
- Проверка на стороне клиента, чтобы использовать встроенную Yii ActiveForm проверку JavaScript, без необходимости обновления страницы.
- Проверка AJAX для проверки подлинности AJAX на стороне сервера для расширения возможностей проверки JavaScript на стороне клиента
Теперь давайте начнем с примеров различных встроенных валидаторов.
Базовые валидаторы полей
Давайте посмотрим на некоторые из основных инструментов проверки поля, которые полезны для повседневной реализации.
Подготовка модели с использованием миграции и Gii
Как мы уже делали в ранних эпизодах этого курса, я собираюсь создать миграцию:
./yii migrate/create create_sample_table
Я создам Sample модель, чтобы создать примерную таблицу и проверки с помощью Gii. Вот код миграции:
<?phpuse yii\db\Schema;use yii\db\Migration;class m150219_235923_create_sample_table extends Migration{ public function up() { $tableOptions = null; if ($this->db->driverName === "mysql") { $tableOptions = "CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB"; } $this->createTable("{{%sample}}", [ "id" => Schema::TYPE_PK, "thought" => Schema::TYPE_STRING." NOT NULL DEFAULT """, "goodness" => Schema::TYPE_SMALLINT . " NOT NULL DEFAULT 0", "rank" => Schema::TYPE_INTEGER . " NOT NULL", "censorship" => Schema::TYPE_STRING . " NOT NULL", "occurred" => Schema::TYPE_DATE . " NOT NULL", ], $tableOptions); } public function down() { $this->dropTable("{{%sample}}"); }}
Затем мы выполним миграцию:
./yii migrate/up Yii Migration Tool (based on Yii v2.0.2)Total 1 new migration to be applied: m150219_235923_create_sample_tableApply the above migration? (yes|no) [no]:yes*** applying m150219_235923_create_sample_table > create table {{%sample}} ... done (time: 0.009s)*** applied m150219_235923_create_sample_table (time: 0.015s)Migrated up successfully.
Далее мы будем использовать генератор кода Yii для построения модели:

А затем CRUD файлы:

Gii генерирует эти правила проверки образца:
class Sample extends \yii\db\ActiveRecord{ public function rules() { return [ [["goodness", "rank"], "integer"], [["rank", "censorship", "occurred"], "required"], [["occurred"], "safe"], [["thought", "censorship"], "string", "max" => 255] ]; }
Теперь давайте использовать их для работы и прохождения некоторых основных валидаторов.
Required Validator
RequiredValidator гарантирует наличие значения. Вы можете увидеть это выше для полей: rank, censorship и occurred.
Перейдите в форму создания Sample, сгенерированную Gii, например, http://localhost:8888/hello/sample/create. При проверке Yii ActiveForm на клиенте JavaScript будет отображать сообщение об ошибке даже при нажатии на одно из этих полей.

Safe Validator
SafeValidator не является истинным валидатором. Он позволяет массовое присвоение переданной веб-формы для включения атрибута, например, $model->attributes = $_POST["Comment"]. Или, в созданном Gii SampleController, вы можете увидеть этот код:
public function actionCreate() { $model = new Sample(); if ($model->load(Yii::$app->request->post()) && $model->save()) { return $this->redirect(["view", "id" => $model->id]); } else { return $this->render("create", [ "model" => $model, ]); } }
Без безопасного правила в Sample модели (или другого правила) указанное значение не будет присвоено атрибутам модели. Это уменьшает вероятность наличия дополнительного вектора атаки без преднамеренного кода.
public function rules() { return [ [["occurred"], "safe"],
Default Value Validator
DefaultValueValidator не является истинным валидатором. Он устанавливает значения по умолчанию для пустых полей.
Давайте изменим правило для occurred
, чтобы установить значение даты по умолчанию с использованием текущей даты. Мы также удалим Required валидатор, чтобы позволить Default валидатору заполнить значение.
public function rules() { return [ [["goodness", "rank"], "integer"], [["rank", "censorship"], "required"], // Gii created this // [["occurred"], "safe"], ["occurred", "default", "value" => date("Y-m-d")],
Когда мы создаем новый Sample и оставляем пустое поле occurred
, вы можете увидеть, что результирующее представление включает текущую дату, заполненную валидатором значений по умолчанию.

Фильтры
FilterValidator также не является истинным валидатором. Он выполняет преобразование по предоставленному значению. Чаще всего вы можете использовать его, чтобы обрезать пробелы с концов строки.
FilterValidators определяются с помощью встроенных функций обратного вызова, таких как эта пользовательская функция проверки:
// an inline validator defined as an anonymous function ["token", function ($attribute, $params) { if (!ctype_alnum($this->$attribute)) { $this->addError($attribute, "The token must contain letters or digits."); } }],
Поскольку trim - это функция PHP, мы можем просто объявить наше правило валидации строкой:
[["thought"], "trim"],
Если вы отправляете форму с начальными или конечными пробелами в поле thought, FilterValidator удалит их.
Теперь давайте посмотрим на некоторые встроенные валидаторы типов.
Валидаторы типов
Валидаторы типов гарантируют соответствие пользовательских данных определенным типам, часто тем, которые указаны в таблице базы данных. Gii автоматически сгенерирует их.
String Validator и Number Validator
StringValidator гарантирует, что значение является строкой. NumberValidator гарантирует, что значение является числовым, например, integer или float.
Ниже приведены примеры правил:
public function rules() { return [ [["goodness", "rank"], "integer"], [["thought", "censorship"], "string", "max" => 255] // [["rank", "censorship"], "required"],
Я также временно удаляю Required валидатор, чтобы посмотреть, как работают строковые и числовые проверки.
Вот как выглядят сообщения об ошибках проверки:

Goodness со значением high выдает ошибку, потому что это не число, а rank со значением 27 проходит проверку. Censorship пуста (NULL), поэтому не выполняется проверка строки.
Boolean Validator
BooleanValidator обеспечивает значение true или false. Вы можете определить значения для true и false. Значение по умолчанию - целое число 0 или 1. Этот валидатор может быть более полезным, когда поле используется с выпадающим списком, например, Да / Нет.
Вот как я определил свое правило для Boolean:
public function rules() { return [ [["goodness"], "boolean"], [["rank"], "integer"],
Вот сообщение об ошибке Boolean валидатора:

Date Validator
DateValidator гарантирует, что значение является правильно отформатированной датой, которую можно настроить с помощью атрибута format. С Yii ActiveForm в настоящее время это проверка на стороне сервера. Поэтому я также добавил требуемое правило для поля Occurred.
Вот мои определения правил с валидатором даты для поля Occused:
public function rules() { return [ [["goodness"], "boolean"], [["rank"], "integer"], [["thought", "censorship"], "string", "max" => 255], [["rank", "censorship","occurred"], "required"], ["occurred", "date", "format" => "yyyy-M-d"], //["occurred", "default", "value" => date("Y-m-d")], [["thought"], "trim"], ]; }
Вот как это выглядит, когда мы отправляем форму:

Что дальше?
Следите за предстоящими уроками в моем курсе Программирование с Yii2, так как я продолжаю погружаться в разные аспекты структуры. В следующих двух эпизодах я проведу вас через оставшиеся валидаторы и покажу вам, как создавать продвинутые расширения для системы проверки Yii.
Вы также можете ознакомиться с моим курсом Построение стартапа с помощью PHP, в которой используется расширенный шаблон Yii2, когда я создаю реальное приложение.
Я приветствую пожелания по темам. Вы можете опубликовать их в комментариях ниже, твитнуть @reifman на Twitter или отправить мне по электронной почте на моем веб-сайте Lookahead Consulting.
Если вы хотите узнать, когда выйдет следующий урок по Yii2, проверьте мою страницу инструктора Tuts+. Она всегда включает все мои опубликованные статьи.
Ссылки по теме
- Yii2 Руководство по проверке ввода пользователя
- Валидаторы Yii2 (документация)
- Yii2 Developer Exchange, мой ресурсный сайт Yii2