Регистрация пользователя в Yii2. Часть 2

Регистрация пользователя в Yii2

От автора: приветствую вас, друзья. Мы продолжаем цикл статей, посвященных знакомству с фреймворком Yii2. В этой статье мы рассмотрим, как осуществляется регистрация пользователя в Yii2.

Продолжим предыдущую статью и работу с регистрацией пользователей во фреймворке Yii. Напомню, мы с вами создали модель для формы регистрации, получили объект этой модели в экшене и добавили представление, которое и показывает искомую форму. Также мы добавили таблицу user в БД, которая и будет хранить данные зарегистрированных пользователей.

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

Современные тенденции и подходы в веб-разработке

Узнайте алгоритм быстрого роста с нуля в сайтостроении

Узнать подробнее

Введем любые тестовые данные и отправим их.

Регистрация пользователя в Yii2

Отлично, работает! Модель заполняется введенными данными. Пойдем дальше. Дальнейшая наша работа будет связана с моделью User, поскольку именно эта модель указана в качестве компонента идентификации в файле config\web.php.

Регистрация пользователя в Yii2

Давайте уберем в экшене распечатку модели формы регистрации и вместо этого получим объект модели User и заполним его полученными из формы данными.

В качестве теста сразу же распечатаем объект $user.

Регистрация пользователя в Yii2

Как видим, в поле password мы записали хэш пароля, а не пароль в открытом виде. Это нам помог сделать метод generatePasswordHash() класса Security. Именно хэш пароля мы и будем записывать в БД, поскольку хранить пароль в открытом виде – плохая практика.

Уберем распечатку и вызовем метод save() модели. После успешного сохранения зарегистрированного пользователя сделаем редирект. Итоговый код экшена будет выглядеть так:

Современные тенденции и подходы в веб-разработке

Узнайте алгоритм быстрого роста с нуля в сайтостроении

Узнать подробнее

Теперь перейдем к модели User и внесем правки в нее. Для начала, вместо Object теперь модель будет наследовать ActiveRecord:

Коль мы работаем с ActiveRecord, объявление свойств модели уже лишние. Теперь давайте попробуем зарегистрироваться на сайте, введя в форму произвольные логин и пароль. Если ошибок нет, то мы будем переброшены на главную страницу. Ну а в БД появится новый пользователь.

Регистрация пользователя в Yii2

Отлично, работает! А давайте попробуем зарегистрировать еще одного пользователя с таким же логином.

Регистрация пользователя в Yii2

Не получилось. Вместо регистрации мы получили ошибку, что логично, поскольку для поля username в таблице проставлен уникальный индекс, т.е. записать дублирующее значение в это поле нам не даст сервер. Это правильно, но не очень красиво. Чтобы избавиться от такой ошибки – добавим правило валидации в модель регистрации:

И проверим еще раз регистрацию повторного имени пользователя.

Регистрация пользователя в Yii2

Вот теперь все хорошо. В следующей статье мы продолжим работать с моделью User и реализуем авторизацию зарегистрированных пользователей.

Больше о фреймворке вы можете узнать из наших бесплатных или платных уроков. Также создание простейшего блога на Yii2 можно посмотреть в этом цикле уроков.

Современные тенденции и подходы в веб-разработке

Узнайте алгоритм быстрого роста с нуля в сайтостроении

Узнать подробнее

Хотите узнать, что необходимо для создания сайта?

Посмотрите видео и узнайте пошаговый план по созданию сайта с нуля!

Смотреть видео

Метки:

Похожие статьи:

Комментарии Вконтакте:

Комментарии Facebook:

Комментарии (25)

  1. Andrey

    Ничерта не работает, ошибку пишет после добавления этого

    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. Это все, что можно посоветовать, не работая с Вашим кодом.

      • Andrey

        Ну я весь код у вас взял. Единственное добавил еще email. При последней распечатке, перед сейвом, все получаю, все выводится.

        Не могу никак понять, почему так…

        • Андрей Кудлай

          Значит, все же где-то есть отличия в коде. Нужно только смотреть код или гадать.

          • Andrey

            Вроде весь код, который добавил. Надеюсь поможете. Если еще код нужен, скажите

          • Андрей Кудлай

            Создайте тему на нашем форуме и дайте ссылку на архив с необходимыми файлами (контроллер, модели, виды). Я попробую посмотреть.

          • Andrey

            Простите за спам( Сейчас вот еще один способ нашел.Так наверное лучше будет. Извините если что за кривость, первый раз им пользуюсь

            https://github.com/andreyNi/yii2-fals/tree/master

          • Андрей Кудлай

            Проблема в модели User. Поскольку теперь в модель данные загружаются из формы, то все свойства, которые имелись по умолчанию в этой модели — не нужны. Соответственно, все выделенное на скриншоте — удалите, после этого должно работать.

          • Andrey

            Огромное спасибо. Все заработало:) Пойду дальше разбираться)

          • Андрей Кудлай

            Пожалуйста)

  2. Andrey

    Я так понял, у меня почему то не передаются значения из формы. кроме id. Вроде все по обоим частям делал((

  3. Andrey

    Не поможете?((

  4. Andrey

    Добрый вечер. Еще ваша помощь понадобилась. А как прикрутить в регистрацию роли от RBAC?

    • Андрей Кудлай

      Здравствуйте. К сожалению, в рамках комментариев на этот вопрос конкретный ответ дать невозможно, для этого нужна серия уроков.

      • Andrey

        Да я смысл то RBAC понял. Вот одна проблема осталась, как свою таблицу с ролями к нему добавить, ну и при регистрации в эту таблицу автоматом дэфоул роль вставлять… Никак понять не могу( И найти нигде не могу, нет ничего в поисковиках(

  5. Oleg

    На этапе $user = new User();
    У меня вылетает ошибка Class ‘app\controllers\User’ not found, щито делать?)

    • Андрей

      User — это модель, поэтому странно, что у Вас ищется контроллер User. Ну а для успешного создания объекта модели User проверьте, чтобы вверху файла было импортировано соответствующее пространство имен:
      use app\models\User;

      • Oleg

        Отлично, но теперь другой трабл) в модели User нет метода save, у меня basic версия yii, в чем проблема?(Calling unknown method: app\models\User::save())

        • Андрей

          Очевидно, Ваша модель не наследует класс ActiveRecord, к которой и принадлежит метод save.

  6. Александр

    Доброе время суток. Учусь по ваших урокам. И столкнулся в этом с проблемой. Когда происходит $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 явно написаны публичные аттрибуты с этими же названиями, вот, когда происходит сохранение, она заносит ВИРТУАЛЬНЫЕ аттрибуты.

      • Alexey

        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

  7. KOstya

    После добавления
    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 и т.д.). В комментариях можно найти соответствующий скриншот.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Я не робот.

Spam Protection by WP-SpamFree