Чат PHP-разработчиков
Регистрация на Symfony. Часть 1: создание сущности пользователя

Регистрация на Symfony. Часть 1: создание сущности пользователя

Вторую часть курса мы начнем с общей детали тысячи приложений - авторизации. У нас будет все: регистрация, вход-выход, кнопка "Запомнить меня" и отправка писем подтверждения регистрации на почту!

Чтобы реализовать регистрацию встроенными инструментами фреймворка, для начала нам нужно создать сущность User и имплементировать UserInterface, который даст нам стандартные методы вроде getRoles(), getUsername(), getSalt() и другие. Итак, через консоль или руками создайте сущность User, имплементируйте интерфейс UserInterface и добавьте методы, которые он требует. Вот как должен выглядеть ваш код на данном этапе:

Теперь давайте добавим поля для сущности. В первую очередь нам нужен id. Также добавим email, password, roles и plainPassword. PlainPassword не сохраняется в базе, он нужен для временного сохранения пароля из формы и валидации. Поле roles будет обычным json, в котором мы будем хранить роли, которыми владеет пользователь. Id у нас будет таким же, как и у сущности Post:

Код доступен только после покупки курса по фреймворку Symfony 4.

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

Код доступен только после покупки курса по фреймворку Symfony 4.

Аннотация @Assert для вас новая, она предоставляет базовую валидацию: NotBlank() - поле не может быть пустым, Email() - введенные данные должны быть электронным адресом, то есть содержать @ и точку (как минимум). Также поле email у нас будет уникальным, что мы определили, указав unique=true. Над полем plainPassword нет аннотации Orm\Column(), потому что нам не надо сохранять это боле в базе, оно нужно только при регистрации пользователя.

Теперь давайте реализуем методы, которые нам дал UserInterface. Метод getRoles() пока будет возвращать обычный массив:

Код доступен только после покупки курса по фреймворку Symfony 4.

Это значит, что любой пользователь, по умолчанию, будет обладать ролью User, что логично. Метод getPassword, собственно, будет обычным геттером пароля:

Код доступен только после покупки курса по фреймворку Symfony 4.

Соль нам не нужна, поэтому возвращаем null или можете вообще оставить метод пустым:

Код доступен только после покупки курса по фреймворку Symfony 4.

А вот getUsername() может возвращать не только username (который я специально не добавил, чтобы показать особенность этого метода), он возвращает то, что для вас является достаточным правом для аутентификация на сайте - в нашем случае это email.

Код доступен только после покупки курса по фреймворку Symfony 4.

Метод eraseCredentials удаляет конфиденциальную информацию о пользователе, например, простой текстовый пароль, которым у нас является plainPassword:

Код доступен только после покупки курса по фреймворку Symfony 4.

Не забудьте добавить геттеры и сеттеры для всех полей. В конечном итоге так будет выглядеть наша сущность:

Код доступен только после покупки курса по фреймворку Symfony 4.

В сеттерах вы могли заметить return $this, то есть сеттер устанавливает значение и возвращает текущий объект. Это позволит нам выполнять цепочку методов без прерывания:

Код доступен только после покупки курса по фреймворку Symfony 4.

Для больших сущностей это крайне удобно, также это удобно, когда вы загружаете фикстуры в базу, где валидация не требуется и поэтому можно непрерывно добавлять (set) данные.

Вверху сущности вы могли заметить следующую аннотацию:

Код доступен только после покупки курса по фреймворку Symfony 4.

С первой вы уже знакомы: мы указываем, какой репозиторий отвечает за работу с этой сущностью. Если вы создавали сущности через команды, то у вас уже есть репозиторий:

Код доступен только после покупки курса по фреймворку Symfony 4.

Если же нет, создайте его сами по примеру репозитория PostRepository.
Вторая аннотация показывает, как будет называться таблица в базе. Третья аннотация нужна для валидации конкретного поля сущности: в нашем случае это поле email. Также вы можете написать сообщение (message), которое покажется над полем email при регистрации, если пользователь уже существует.

Когда мы все сделали, нам нужно обновить наши миграции следующими командами:

Код доступен только после покупки курса по фреймворку Symfony 4.

Если вы все сделали правильно, в базе у вас появится таблица user. На этом мы закончили первую часть большой темы по созданию регистрации. До новых встреч!

Онлайн обучение PHP
Путь с полного нуля до джуниора!
Начать бесплатно
Читайте также
Курс программирования на PHP
Подготовка до уровня устройства на работу!
Начать бесплатно
Комментарии (11)


ilyaOrlov

Создавал сущность через "make", поэтому репозиторий существует. Код проверял несколько раз. Миграцию в папке "Migrations" создает. Но при команде "php bin/console doctrine:migrations:migrate" выдает ошибку. Ради интереса даже скопировал полностью ваш код, но ошибка осталась.

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'JSON NOT NULL COMMENT '(DC2Type:json_array)', UNIQUE INDEX UNIQ_8D93D649E7927C74' at line 1

Я так понимаю, что-то не так с MySQL?

kafkiansky

У вас какая версия mysql?

ilyaOrlov

5.6

kafkiansky

Покажите последний файл миграции. А также советую для начала сделать следующее: php bin/console doctrine:schema:drop - - Force & & bin/console doctrine:schema:update - - force

ilyaOrlov
<?php

declare(strict_types=1);

namespace DoctrineMigrations;

use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;

/**
 * Auto-generated Migration: Please modify to your needs!
 */
final class Version20190215184859 extends AbstractMigration
{
    public function getDescription() : string
    {
        return '';
    }

    public function up(Schema $schema) : void
    {
        // this up() migration is auto-generated, please modify it to your needs
        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.');

        $this->addSql('CREATE TABLE user (id INT AUTO_INCREMENT NOT NULL, email VARCHAR(255) NOT NULL, password VARCHAR(255) NOT NULL, roles JSON NOT NULL COMMENT \'(DC2Type:json_array)\', UNIQUE INDEX UNIQ_8D93D649E7927C74 (email), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB');
    }

    public function down(Schema $schema) : void
    {
        // this down() migration is auto-generated, please modify it to your needs
        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.');

        $this->addSql('DROP TABLE user');
    }
}
ilyaOrlov

После второй команды вылетают те же ошибки(

ilyaOrlov

Такое чувство, как будто не нравится ему формат "json_array"

kafkiansky

Да, возможно, дело в вашей версии. Попробуйте пока убрать этот тип. Я поизучаю ошибку и найду решение

ilyaOrlov

А я попробую на версии 5.7

ilyaOrlov

Да, знаете. На версии MySQL-5.7 миграция прошла без ошибок. Таблица создалась в БД :)

kafkiansky

Отлично!

Самый понятный курс PHP
Онлайн-уроки в удобное время!
Начать бесплатно
Популярное за сутки
Онлайн-курсы PHP и MySQL
Обучение с полного нуля до уровня джуниора!
Начать бесплатно
Сейчас читают
Онлайн-курсы PHP и MySQL
Обучение с полного нуля до уровня джуниора!
Начать бесплатно
Новые статьи
Логические задачи с собеседований