Модели и правила проверки
Данным от посетителя нельзя доверять: заголовок может быть пустым, а почта — написана с ошибкой. В Yii требования к данным описывают в модели, в методе rules(). Проверка выполняется одним вызовом и сама собирает сообщения об ошибках.
Где описывают правила
Правила пишут в классе модели. Добавьте метод в models/Post.php:
// models/Post.php
public function rules(): array
{
return [
[['title', 'body'], 'required'],
];
}Каждое правило — массив: сначала поля, затем имя проверки. Здесь заголовок и текст обязательны.
Запуск проверки
$post = new Post();
$post->title = '';
if (!$post->validate()) {
print_r($post->errors);
}Код выведет массив с двумя сообщениями: «Title cannot be blank» и «Body cannot be blank» (при 'language' => 'ru-RU' — на русском). Метод save() вызывает validate() сам, поэтому статья с пустым заголовком в базу не попадёт.
Встроенные проверки
public function rules(): array
{
return [
[['title', 'body'], 'required'],
['title', 'string', 'min' => 3, 'max' => 255],
['status', 'in', 'range' => [0, 1]],
['slug', 'unique'],
['title', 'trim'],
['status', 'default', 'value' => 0],
];
}| Проверка | Что требует |
|---|---|
required | Поле заполнено |
string | Строка, с min и max — заданной длины |
integer, number | Целое или любое число |
email, url | Адрес почты или сайта |
in | Значение из списка range |
unique | Такого значения ещё нет в таблице |
compare | Совпадение с другим полем, например повтор пароля |
trim, default | Не проверяют, а исправляют: убирают пробелы, задают значение по умолчанию |
Свой текст ошибки
['title', 'required', 'message' => 'Введите заголовок статьи.'],Параметр message заменяет стандартное сообщение.
Подписи полей
В сообщениях используется название поля. Его задаёт метод attributeLabels():
// models/Post.php
public function attributeLabels(): array
{
return [
'title' => 'Заголовок',
'body' => 'Текст',
];
}Теперь ошибка звучит как «Необходимо заполнить «Заголовок»». Те же подписи появятся в формах и таблицах.
Собственное правило
Если встроенных проверок мало, именем правила служит метод модели:
public function rules(): array
{
return [
['title', 'validateNoCaps'],
];
}
public function validateNoCaps(string $attribute): void
{
if (mb_strtoupper($this->$attribute) === $this->$attribute) {
$this->addError($attribute, 'Не пишите заголовок одними заглавными буквами.');
}
}Метод получает имя поля и при нарушении добавляет ошибку вызовом addError().
Модель без таблицы
Данные, которые не хранятся в таблице (форма входа, обратная связь), описывают классом, унаследованным от yii\base\Model. Поля в нём объявляют открытыми свойствами, а rules() пишут так же. Пример есть в проекте — models/ContactForm.php.
Частая ошибка
Метод load(), который заполняет модель данными формы, переносит только поля, упомянутые в rules(). Поле без единого правила считается небезопасным и молча пропускается — значение из формы не сохранится. Если проверять поле не нужно, добавьте ему правило safe: ['slug', 'safe'].