Урок 6: Формы и валидация на Yii 2

В 6-ом уроке мы изучим важную тему веб-разработки, это работу с формами и валидацией данных. Если вы когда-нибудь задумывались, как сделать так, чтобы пользователи вводили корректные данные, а ваше приложение оставалось безопасным и удобным, этот урок для вас. В Yii 2 всё это реализуется элегантно и с минимальными усилиями, особенно если использовать встроенные инструменты вроде ActiveForm.

Создание форм с помощью класса ActiveForm

Первое, что нужно понять, формы в Yii 2, это не просто HTML-теги. Это полноценные объекты, которые взаимодействуют с моделями. ActiveForm это виджет, который автоматически связывает поля формы с атрибутами модели, упрощая валидацию и обработку данных.

Представьте, что у нас есть модель User для регистрации пользователей. Чтобы создать форму, в представлении (view) мы подключаем класс ActiveForm и начинаем работу:

php
use yii\widgets\ActiveForm;

$form = ActiveForm::begin([
    'id' => 'registration-form',
    'options' => ['class' => 'form-horizontal'],
]);

echo $form->field($model, 'username')->textInput(['autofocus' => true]);
echo $form->field($model, 'email')->input('email');
echo $form->field($model, 'password')->passwordInput();
echo $form->field($model, 'agree')->checkbox(['label' => 'Я согласен с условиями']);

echo '<div class="form-group">';
    echo Html::submitButton('Зарегистрироваться', ['class' => 'btn btn-primary']);
echo '</div>';

ActiveForm::end();

Метод field() связывает каждое поле формы с атрибутом модели. Например, $form->field($model, 'username') создаёт input для атрибута username, автоматически подтягивает метку (label) из модели и настраивает валидацию. Обратите внимание на методы textInput()passwordInput(), они определяют тип поля.

ActiveForm также автоматически добавляет CSS-классы для стилизации ошибок. Если валидация не пройдена, поля подсветятся красным, а рядом появятся сообщения об ошибках. Но об этом позже.

Практическая задача 1: Создайте форму для модели Post с полями title (текст), content (textarea), status (выпадающий список с вариантами: draft, published).

Валидация данных: встроенные и кастомные правила

Валидация это сердце любой формы. В Yii 2 правила валидации задаются в методе rules() модели. Давайте разберёмся, как это работает.

Допустим, наша модель User требует, чтобы username был обязательным и не длиннее 50 символов, а email корректным и уникальным. Вот как это выглядит в коде:

php
public function rules()
{
    return [
        [['username', 'email', 'password'], 'required'],
        ['username', 'string', 'max' => 50],
        ['email', 'email'],
        ['email', 'unique', 'targetClass' => User::class],
        ['password', 'string', 'min' => 6],
        ['agree', 'compare', 'compareValue' => true, 'message' => 'Вы должны согласиться с условиями.'],
    ];
}

Здесь:

  • required поле обязательно для заполнения.
  • string проверяет, что значение строка, а max/min задают ограничения.
  • email проверяет формат email.
  • unique гарантирует, что значение уникально в таблице User.
  • compare сравнивает значение с другим (например, чекбокс согласия).

А если нужно кастомное правило? Например, запретить регистрацию с определёнными словами в username. Есть два подхода:

  1. Встроенный валидатор через метод:
    Добавим в модель метод validateUsername():
php
public function validateUsername($attribute, $params)
{
    $forbiddenWords = ['admin', 'root'];
    if (in_array($this->$attribute, $forbiddenWords)) {
        $this->addError($attribute, 'Этот username запрещён.');
    }
}

И добавим правило в rules():

php
['username', 'validateUsername'],
  1. Создание отдельного класса валидатора:
    Создадим класс ForbiddenWordsValidator:
php
namespace app\validators;

use yii\validators\Validator;

class ForbiddenWordsValidator extends Validator
{
    public function validateAttribute($model, $attribute)
    {
        $forbiddenWords = ['admin', 'root'];
        if (in_array($model->$attribute, $forbiddenWords)) {
            $model->addError($attribute, 'Этот username запрещён.');
        }
    }
}

Теперь в rules() модели:

php
['username', 'app\validators\ForbiddenWordsValidator'],

Практическая задача 2: Добавьте правило, чтобы пароль содержал как минимум одну цифру и одну заглавную букву.

Обработка отправки формы в контроллере

Теперь, когда форма создана, нужно обработать данные после отправки. Всё происходит в экшене контроллера. Рассмотрим пример:

php
public function actionRegistration()
{
    $model = new User();

    if ($model->load(Yii::$app->request->post()) && $model->validate()) {
        // Сохранение в БД
        $model->password = Yii::$app->security->generatePasswordHash($model->password);
        if ($model->save(false)) { // false не выполнять валидацию повторно
            Yii::$app->session->setFlash('success', 'Регистрация успешна!');
            return $this->redirect(['site/index']);
        }
    }

    return $this->render('registration', [
        'model' => $model,
    ]);
}

Что здесь важно:

  • $model->load(...) загружает данные POST-запроса в модель.
  • validate() запускает все правила из rules().
  • Если данные валидны, сохраняем модель в БД. Обратите внимание на save(false),  мы отключаем повторную валидацию, так как уже проверили данные.
  • Если что-то пошло не так, форма отобразится с ошибками.

Всегда проверяйте как load(), так и validate() или save(). Это защищает от попыток передать в модель не те поля, которые ожидаются.

Вывод ошибок валидации

Yii 2 делает вывод ошибок почти автоматическим. Если вы используете ActiveForm, сообщения появятся рядом с полями. Например, если пользователь не ввёл email, под полем будет красный текст: «Email не может быть пустым».

Но иногда нужно вывести ошибки глобально. Для этого есть методы errorSummary() и errorDetail():

php
// Вывод всех ошибок списком
echo $form->errorSummary($model);

// Вывод ошибки для конкретного атрибута
echo $form->field($model, 'email')->error(['class' => 'text-danger']);

Если вы хотите кастомизировать сообщения, это можно сделать в правилах:

php
['email', 'required', 'message' => 'Пожалуйста, укажите email.'],

Практическая задача 3: Добавьте вывод общей сводки ошибок в верхней части формы.

В Yii 2 этот процесс максимально автоматизирован, но при этом остаётся гибким. ActiveForm, встроенные правила валидации, удобная обработка в контроллере. Всё это позволяет сосредоточиться на логике приложения, а не на рутинных проверках.

Валидация на стороне клиента  это удобство для пользователя, но валидация на сервере обязательна для безопасности.

Если вы хотите глубже изучить Yii 2, посмотрите полный курс по Yii 2 для начинающих. Там вы найдёте ещё больше примеров, практических задач и советов от практикующего разработчика.

Поделиться статьей:
Поддержать автора блога

Поддержка автора осуществляется с помощью специальной формы ниже, предоставленной сервисом «ЮMoney». Все платёжные операции выполняются на защищённой странице сервиса, что обеспечивает их корректность и полную безопасность.

Персональные рекомендации
Оставить комментарий