FOSUserBundle Symfony

FOSUserBundle

Данный материал является переводом оригинальной статьи с некоторыми разъяснениями. В дополнение к статье добавлена инструкция по изменению стандартных шаблонов.

Сразу по поводу названия FOSUserBundle. User вроде как понятно - это пользователь, ну а что же такое бандлы? Поясню, фреймворк Symfony практически не использует функций ядра, основное его назначение руководить сервисами. Например, метод render вызывает сервис templating, а тот уже свои свойства и методы. И все эти сервисы и есть бандлы.

А что насчет FOS? Это аббревиатура от Friend Of Symfony. Друзьями Symfony разработчики пакета являются по причине причастности к разработке самого фреймворка. Это не единственный инструмент в их арсенале, подробнее можно ознакомиться тут.

Пакет является достаточно популярным и, что очень важно, простым и удобным в использовании. По умолчанию в него уже входят такие вещи как:

  • - login;
  • - register;
  • - resetting;
  • - admin.

План работы

Установка представляет собой процесс в 7 шагов:

  • - установка symfony/skeleton и необходимых компонентов;
  • - подключение FOSUserBundle через composer;
  • - создание класса User;
  • - настройка файла security.yaml;
  • - настройка FOSUserBundle;
  • - импорт маршрутов FOSUserBundle;
  • - создание базы данных.

Установка Symfony

Первым шагом является установка Symfony. С различиями между вариантами установки можно ознакомиться здесь. В консоли пишем:

        
    composer create-project symfony/skeleton имя_вашего_проекта
        
    

Подключаем Doctrine.

        
    composer require doctrine
        
    

На этом шаге необходимо изменить ваш .env файл для конфигурации подключения к БД. Необходимо указать пользователя, пароль, ip и имя базы данных. В .env строка для изменения выглядит так:

        
    DATABASE_URL=mysql://db_user:db_password@127.0.0.1:3306/db_name
        
    

Если возникли сложности на текущем моменте, обратитесь к статье.

Подключаем аннотации.

Парсер аннотаций PHPDocBlock, используемый в Doctrine.

        
    composer require annotations
        
    

Подключаем Translation.

Translation - переводчик. Нам нужен как зависимость.

        
    composer require symfony/translation
        
    

Подключаем Twig.

Twig - гибкий, быстрый и безопасный шаблонизатор для PHP.

        
    composer require twig
        
    

Подключаем веб-сервер.

Просто небольшой и удобный веб-сервер.

        
    composer require server
        
    

Установка FOSUserBundle через composer

Собственно, подключаем:

        
    composer require friendsofsymfony/user-bundle
        
    

После установки лицезреете ошибку? Супер! Продолжаем.


Создаем класс User

В директории src/Entity создайте класс User который расширяет BaseUser. Последний объявлен как псевдоним FOS\UserBundle\Model\User.

        
    // src/Entity/User.php

    namespace App\Entity;

    use FOS\UserBundle\Model\User as BaseUser;
    use Doctrine\ORM\Mapping as ORM;

    /**
     * @ORM\Entity
     * @ORM\Table(name="fos_user")
     */
    class User extends BaseUser
    {
        /**
         * @ORM\Id
         * @ORM\Column(type="integer")
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        protected $id;

        public function __construct()
        {
            parent::__construct();
            // your own logic
        }
    }
        
    

В примере выше аннотация @ORM\Table(name="fos_user") отвечает за имя вашей будущей таблицы. fos_user тоже понятно, в принципе, но лучше будет обозвать таблицу просто user.

        
    /**
     * @ORM\Entity
     * @ORM\Table(name="user")
     */
        
    

Настройка security.yaml

На данном шаге изменим настройки безопасности для FOSUserBundle в файле config/packages/security.yaml.

        
    security:
        encoders:
            FOS\UserBundle\Model\UserInterface: bcrypt

        role_hierarchy:
            ROLE_ADMIN:       ROLE_USER
            ROLE_SUPER_ADMIN: ROLE_ADMIN

        #https//symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
        providers:
            fos_userbundle:
                id: fos_user.user_provider.username

        firewalls:
            dev:
                pattern: ^/(_(profiler|wdt)|css|images|js)/
                security: false
            main:
                pattern: ^/
                form_login:
                    provider: fos_userbundle
                    csrf_token_generator: security.csrf.token_manager

                logout:       true
                anonymous:    true

        # Easy way to control access for large sections of your site
        # Note: Only the *first* access control that matches will be used
        access_control:
            - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
            - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
            - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
            - { path: ^/admin/, role: ROLE_ADMIN }
        
    

Настройка FOSUserBundle

Создайте новый файл config/packages/fos_user.yaml для конфигурации FOSUserBundle. И добавьте в него код:

        
    fos_user:
    db_driver: orm # other valid values are 'mongodb' and 'couchdb'
    firewall_name: main
    user_class: App\Entity\User
    from_email:
        address: "example@mail.ru"
        sender_name: "example@mail.ru"
        
    

Обновите config/packages/framework.yaml для добавления конфигурации шаблонизатора. Добавьте в конец файла:

        
    templating:
        engines: ['twig', 'php']
        
    

Импорт маршрутизации FOSUserBundle

Создайте config/routes/fos_user.yaml и добавьте в него:

        
    fos_user:
    resource: "@FOSUserBundle/Resources/config/routing/all.xml"
        
    

Создание базы данных

Если база еще создана - сделаем это с помощью доктрины:

        
    php bin/console doctrine:database:create
        
    

Обновите базу на основе вашего класса пользователя:

        
    php bin/console doctrine:schema:update --force
        
    

На этом этапе все установлено и настроено для использования FOSUserBundle в Symfony 4. Выполните следующую команду, чтобы проверить, все ли в порядке:

        
    composer update
        
    

Если нет сообщений об ошибке, запускаем веб-сервер и тестируем. Переходим по маршруту /register, вводим данные, смотрим в базу.

        
    php bin/console server:start
        
    

Подключаем свои шаблоны

Стандартные шаблоны дизайном не блещут. Как бы их переопредить?
Поскольку пакет FOSUserBundle мы подключали с помощью composer, сейчас его расположение - папка vendor. В ней нам нужно пройти по пути friendsofsymfony->user-bundle->Resources->views. В данной директории располагаются шаблоны по умолчанию. Нам нужно всего лишь их переопределить.

Создадим в каталоге templates папку bundles, а в ней FOSUserBundle.
Общий принцип переопределения, на примере логина, следующий - создаем одноименную папку в каталоге templates, а в нее кладем одноименный шаблон. Для логина выглядит это так: Login

То есть просто копируете нужную вам папку из Resources->views в templates->bundles->FOSUserBundle. Далее просто меняем шаблоны как нам хочется. Например, login_content.html.twig. Login

В случае с регистрацией всё так же просто, но в ступор может ввести вывод формы через виджет. Login В данном случае можем выводить отдельные элементы формы, например так:

        
    {{ form_widget(form.email) }}
    {{ form_widget(form.username) }}
        
    
Login

Контроллеры переопределяются так же просто с помощью наследования.