От автора: приветствую вас, друзья. Мы продолжаем цикл статей, посвященных знакомству с фреймворком Yii2. В этой статье мы рассмотрим, как осуществляется регистрация пользователя в Yii2.
Продолжим предыдущую статью и работу с регистрацией пользователей во фреймворке Yii. Напомню, мы с вами создали модель для формы регистрации, получили объект этой модели в экшене и добавили представление, которое и показывает искомую форму. Также мы добавили таблицу user в БД, которая и будет хранить данные зарегистрированных пользователей.
Давайте теперь попробуем принять данные из формы и проверить, загружаются ли они в модель, распечатав на экран содержимое модели:
1 2 3 4 5 6 7 8 9 10 11 12 | public function actionSignup(){ if (!Yii::$app->user->isGuest) { return $this->goHome(); } $model = new SignupForm(); if($model->load(\Yii::$app->request->post()) && $model->validate()){ echo '<pre>'; print_r($model); die; } return $this->render('signup', compact('model')); } |

Фреймворк Yii2. Быстрый старт
Получите курс и узнайте, как с помощью фреймворка Yii2 разрабатывать веб-приложения на примере блога
Смотреть курсВведем любые тестовые данные и отправим их.
Отлично, работает! Модель заполняется введенными данными. Пойдем дальше. Дальнейшая наша работа будет связана с моделью User, поскольку именно эта модель указана в качестве компонента идентификации в файле config\web.php.
Давайте уберем в экшене распечатку модели формы регистрации и вместо этого получим объект модели User и заполним его полученными из формы данными.
1 2 3 4 5 6 | if($model->load(\Yii::$app->request->post()) && $model->validate()){ $user = new User(); $user->username = $model->username; $user->password = \Yii::$app->security->generatePasswordHash($model->password); echo '<pre>'; print_r($user); die; } |
В качестве теста сразу же распечатаем объект $user.
Как видим, в поле password мы записали хэш пароля, а не пароль в открытом виде. Это нам помог сделать метод generatePasswordHash() класса Security. Именно хэш пароля мы и будем записывать в БД, поскольку хранить пароль в открытом виде – плохая практика.
Уберем распечатку и вызовем метод save() модели. После успешного сохранения зарегистрированного пользователя сделаем редирект. Итоговый код экшена будет выглядеть так:

Фреймворк Yii2. Быстрый старт
Получите курс и узнайте, как с помощью фреймворка Yii2 разрабатывать веб-приложения на примере блога
Смотреть курс 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public function actionSignup(){ if (!Yii::$app->user->isGuest) { return $this->goHome(); } $model = new SignupForm(); if($model->load(\Yii::$app->request->post()) && $model->validate()){ $user = new User(); $user->username = $model->username; $user->password = \Yii::$app->security->generatePasswordHash($model->password); if($user->save()){ return $this->goHome(); } } return $this->render('signup', compact('model')); } |
Теперь перейдем к модели User и внесем правки в нее. Для начала, вместо Object теперь модель будет наследовать ActiveRecord:
1 | class User extends ActiveRecord implements IdentityInterface{} |
Коль мы работаем с ActiveRecord, объявление свойств модели уже лишние. Теперь давайте попробуем зарегистрироваться на сайте, введя в форму произвольные логин и пароль. Если ошибок нет, то мы будем переброшены на главную страницу. Ну а в БД появится новый пользователь.
Отлично, работает! А давайте попробуем зарегистрировать еще одного пользователя с таким же логином.
Не получилось. Вместо регистрации мы получили ошибку, что логично, поскольку для поля username в таблице проставлен уникальный индекс, т.е. записать дублирующее значение в это поле нам не даст сервер. Это правильно, но не очень красиво. Чтобы избавиться от такой ошибки – добавим правило валидации в модель регистрации:
1 2 3 4 5 6 | public function rules() { return [ [['username', 'password'], 'required', 'message' => 'Заполните поле'], ['username', 'unique', 'targetClass' => User::className(), 'message' => 'Этот логин уже занят'], ]; } |
И проверим еще раз регистрацию повторного имени пользователя.
Вот теперь все хорошо. В следующей статье мы продолжим работать с моделью User и реализуем авторизацию зарегистрированных пользователей.
Больше о фреймворке вы можете узнать из наших бесплатных или платных уроков. Также создание простейшего блога на Yii2 можно посмотреть в этом цикле уроков.

Фреймворк Yii2. Быстрый старт
Получите курс и узнайте, как с помощью фреймворка Yii2 разрабатывать веб-приложения на примере блога
Смотреть курс
Ничерта не работает, ошибку пишет после добавления этого
if($user->save()){
return $this->goHome();
}
Database Exception – yii\db\Exception
SQLSTATE[HY000]: General error: 1364 Field ‘username’ doesn’t have a default value
The SQL being executed was: INSERT INTO
user
(id
) VALUES (DEFAULT)Судя по ошибке, модель не получает как минимум имя пользователя. Распечатайте модель, как это делается в статье, чтобы убедиться, что данные из формы действительно приходят и загружаются. Также убедитесь, что данные корректно заполняются в модели User. Это все, что можно посоветовать, не работая с Вашим кодом.
Ну я весь код у вас взял. Единственное добавил еще email. При последней распечатке, перед сейвом, все получаю, все выводится.
Не могу никак понять, почему так…
Значит, все же где-то есть отличия в коде. Нужно только смотреть код или гадать.
Вроде весь код, который добавил. Надеюсь поможете. Если еще код нужен, скажите
Создайте тему на нашемфоруме и дайте ссылку на архив с необходимыми файлами (контроллер, модели, виды). Я попробую посмотреть.
Простите за спам( Сейчас вот еще один способ нашел.Так наверное лучше будет. Извините если что за кривость, первый раз им пользуюсь
Проблема в модели User. Поскольку теперь в модель данные загружаются из формы, то все свойства, которые имелись по умолчанию в этой модели — не нужны. Соответственно, все выделенное наскриншоте — удалите, после этого должно работать.
Огромное спасибо. Все заработало:) Пойду дальше разбираться)
Пожалуйста)
Я так понял, у меня почему то не передаются значения из формы. кроме id. Вроде все по обоим частям делал((
Вот такая же проблема. Как ее решить?
Не поможете?((
Добрый вечер. Еще ваша помощь понадобилась. А как прикрутить в регистрацию роли от RBAC?
Здравствуйте. К сожалению, в рамках комментариев на этот вопрос конкретный ответ дать невозможно, для этого нужна серия уроков.
Да я смысл то RBAC понял. Вот одна проблема осталась, как свою таблицу с ролями к нему добавить, ну и при регистрации в эту таблицу автоматом дэфоул роль вставлять… Никак понять не могу( И найти нигде не могу, нет ничего в поисковиках(
На этапе $user = new User();
У меня вылетает ошибка Class ‘app\controllers\User’ not found, щито делать?)
User — это модель, поэтому странно, что у Вас ищется контроллер User. Ну а для успешного создания объекта модели User проверьте, чтобы вверху файла было импортировано соответствующее пространство имен:
use app\models\User;
Отлично, но теперь другой трабл) в модели User нет метода save, у меня basic версия yii, в чем проблема?(Calling unknown method: app\models\User::save())
Очевидно, Ваша модель не наследует класс ActiveRecord, к которой и принадлежит метод save.
Доброе время суток. Учусь по ваших урокам. И столкнулся в этом с проблемой. Когда происходит $user->save() пишет вот, что: «1062 Duplicate entry » for key ‘username’
The SQL being executed was: INSERT INTO
user
(id
) VALUES (DEFAULT)», то есть он заносит пустой username в таблицу. Но если вывести данные объекта пользователя, там username, password есть! Но когда вносится — нету! Помогите пожалуйстаРазобрался, не знаю почему, но в статье ничего не сказано, и у людей видимо всё работает, а может это делалось раньше. В чем соль моей проблемы, кратко — нужно удалить все публичные аттрибуты, которые называются также как и столбцы в таблице БД, ещё короче — удалить public $username и остальные, а теперь почему так — User.php это модель таблицы, Yii2 сама подключает её к одноименной таблице, и названия столбцов она делает в названия аттрибутов (виртуальные), т.е. они одинаковы, однако помимо этого в User.php явно написаны публичные аттрибуты с этими же названиями, вот, когда происходит сохранение, она заносит ВИРТУАЛЬНЫЕ аттрибуты.
Class ‘app\models\ActiveRecord’ not found
1. in C:\OSPanel\domains\apteka_v2\cms\models\User.php at line 9
class User extends ActiveRecord implements IdentityInterface
Попробуй написать так…
<?php
namespace app\models;
use yii\db\ActiveRecord;
use yii\web\IdentityInterface;
class User extends ActiveRecord implements IdentityInterface
{
Условия, которые были написаны до нас
}
Когда я добавил эти строки, то всё заработало.
Не забудь чекнуть и другие ответы по ошибкам. Например, скриншот.
После добавления
if($user->save()){
return $this->goHome();
}
Выдает
Unknown Method – yii\base\UnknownMethodException
Calling unknown method: app\models\User::save()
Как решить эту проблему? composer update это не помогает
Посмотрите комментарии выше, в них есть ответ. Метод save — это метод класса ActiveRecord. Соответственно, чтобы этот метод был доступен — необходимо, чтобы модель User наследовала класс ActiveRecord. Также из модели User необходимо удалить свойства, которые были указаны изначально (id, username и т.д.). В комментариях можно найти соответствующий скриншот.
Кто сталкивался? The server requested authentication method unknown to the client [caching_sha2_password]