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, а в нее кладем одноименный шаблон.
Для логина выглядит это так:
То есть просто копируете нужную вам папку из Resources->views в templates->bundles->FOSUserBundle. Далее просто меняем шаблоны как нам хочется. Например, login_content.html.twig.
В случае с регистрацией всё так же просто, но в ступор может ввести вывод формы через виджет. В данном случае можем выводить отдельные элементы формы, например так:
{{ form_widget(form.email) }}
{{ form_widget(form.username) }}
Контроллеры переопределяются так же просто с помощью наследования.