В 6-ом уроке мы изучим важную тему веб-разработки, это работу с формами и валидацией данных. Если вы когда-нибудь задумывались, как сделать так, чтобы пользователи вводили корректные данные, а ваше приложение оставалось безопасным и удобным, этот урок для вас. В Yii 2 всё это реализуется элегантно и с минимальными усилиями, особенно если использовать встроенные инструменты вроде ActiveForm.
Создание форм с помощью класса ActiveForm
Первое, что нужно понять, формы в Yii 2, это не просто HTML-теги. Это полноценные объекты, которые взаимодействуют с моделями. ActiveForm это виджет, который автоматически связывает поля формы с атрибутами модели, упрощая валидацию и обработку данных.
Представьте, что у нас есть модель User для регистрации пользователей. Чтобы создать форму, в представлении (view) мы подключаем класс ActiveForm и начинаем работу:
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 корректным и уникальным. Вот как это выглядит в коде:
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. Есть два подхода:
- Встроенный валидатор через метод:
Добавим в модель методvalidateUsername():
public function validateUsername($attribute, $params) { $forbiddenWords = ['admin', 'root']; if (in_array($this->$attribute, $forbiddenWords)) { $this->addError($attribute, 'Этот username запрещён.'); } }
И добавим правило в rules():
['username', 'validateUsername'],
- Создание отдельного класса валидатора:
Создадим классForbiddenWordsValidator:
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() модели:
['username', 'app\validators\ForbiddenWordsValidator'],
Практическая задача 2: Добавьте правило, чтобы пароль содержал как минимум одну цифру и одну заглавную букву.
Обработка отправки формы в контроллере
Теперь, когда форма создана, нужно обработать данные после отправки. Всё происходит в экшене контроллера. Рассмотрим пример:
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():
// Вывод всех ошибок списком echo $form->errorSummary($model); // Вывод ошибки для конкретного атрибута echo $form->field($model, 'email')->error(['class' => 'text-danger']);
Если вы хотите кастомизировать сообщения, это можно сделать в правилах:
['email', 'required', 'message' => 'Пожалуйста, укажите email.'],
Практическая задача 3: Добавьте вывод общей сводки ошибок в верхней части формы.
В Yii 2 этот процесс максимально автоматизирован, но при этом остаётся гибким. ActiveForm, встроенные правила валидации, удобная обработка в контроллере. Всё это позволяет сосредоточиться на логике приложения, а не на рутинных проверках.
Валидация на стороне клиента это удобство для пользователя, но валидация на сервере обязательна для безопасности.
Если вы хотите глубже изучить Yii 2, посмотрите полный курс по Yii 2 для начинающих. Там вы найдёте ещё больше примеров, практических задач и советов от практикующего разработчика.
Поддержка автора осуществляется с помощью специальной формы ниже, предоставленной сервисом «ЮMoney». Все платёжные операции выполняются на защищённой странице сервиса, что обеспечивает их корректность и полную безопасность.


