Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Модели и правила проверки

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

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.