От автора: приветствую вас, друзья. Мы продолжаем цикл статей, посвященных знакомству с фреймворком 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')); } |
Введем любые тестовые данные и отправим их.
Отлично, работает! Модель заполняется введенными данными. Пойдем дальше. Дальнейшая наша работа будет связана с моделью 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() модели. После успешного сохранения зарегистрированного пользователя сделаем редирект. Итоговый код экшена будет выглядеть так:
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 можно посмотреть в этом цикле уроков.
Комментарии (27)