Правильные папки для установки и конфигурации FOSUserBundle в Symfony 4

Symfony уже обновилась до 4.1, популярные бандлы добавляют совместимость, а вот документацию обновлять не спешат. Когда я впервые пыталась установить FOSUserBundle, серьёзно запуталась. Для профессионалов это, может, и очевидно, но мне стоило разобраться сначала, как изменилась структура папок и куда теперь смотреть.

Установка

Предполагается, что установить Symfony и нужные компоненты вы уже сможете. Требуются Doctrine, Annotations, SwiftMailer, Translation и Twig – всё это уже есть в вашем проекте, если создали его как symfony/website-skeleton, и всё это нужно добавить, если использовали symfony/skeleton. И ещё нужны настроенные в файле .env доступ к базе данных и mailer.
Устанавливается FOSUserBundle просто, но шаги установки используют не те файлы, которые сейчас указаны в документации. Пройдёмся по порядку, указываю не полностью инструкцию – её найдёте в документации – а правильные папки и файлы в Symfony 4.

Обработка шаблонов

Иногда FOSUserBundle выдаёт ошибку при установке, если в файле config/packages/framework.yaml не указан обработчик шаблонов.
Просто добавить туда templating: engines

1
2
3
framework:
templating:
engines: ['twig']

Создание класса User

В папке src/Entity

security.yaml

Теперь в config/packages/security.yaml

Базовая настройка

Совсем рядом: config/packages/fos_user.yaml
В примере у меня уже изменены формы регистрации и редактирования профиля, включено подтверждение регистрации по e-mail.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# config/packages/fos_user.yaml
fos_user:
db_driver: orm
firewall_name: main
user_class: App\Entity\User
from_email:
address: "example@example.ru"
sender_name: "admin"
registration:
confirmation:
enabled: true
form:
type: App\Form\RegistrationFormType
profile:
form:
type: App\Form\ProfileFormType

Прописать адреса

В файле config/routes/fos_user.yaml. Если этого файла нет, создать его.

1
2
3
4
# config/routes/fos_user.yaml

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

В остальном инструкция по установке в документации актуальна.

Замена стандартных сообщений и шаблонов

Переводы

Чтобы все надписи отображались корректно (на языке, который по умолчанию проставлен в config/services.yaml), должны быть включены переводы в файле config/packages/translation.yaml. Обычно всё там настроено по умолчанию:

1
2
3
4
5
6
7
8
# config/packages/translation.yaml
framework:
default_locale: '%locale%'
translator:
paths:
- '%kernel.project_dir%/translations'
fallbacks:
- '%locale%'

Для того, чтобы изменить сообщения, нужно в папке translations создать файл FOSUserBundle.ru.yml (например, для русского языка). Исходный файл найдёте в vendor/friendsofsymfony/user-bundle/Resources/translations/, там можно структуру посмотреть.
Но после изменения файлов переводы не обновляются в отображении страниц, пока не почистить кэш:

1
bin/console cache:clear

Шаблоны

Казалось, что это самое сложное и запутанное, а между тем подсказки охотно выдаёт Profiler.
Итак, для замены шаблонов нужно создать папку templates/bundles/FOSUserBundle/, а в ней структура должна быть как в vendor/friendsofsymfony/user-bundle/Resources/views/.
Всё заменять совсем не нужно. Например, в рабочем проекте у меня лежат только эти файлы:

1
2
3
4
5
6
7
8
9
10
11
.
├── layout.html.twig
├── Profile
│   ├── edit_content.html.twig
│   └── show_content.html.twig
├── Registration
│   ├── confirmed.html.twig
│   ├── email.txt.twig
│   └── register_content.html.twig
└── Security
└── login_content.html.twig

Остальное просто ссылается на тот же самый layout.html.twig. За что и люблю Twig.

На этом всё.
В конфигурации выше был ещё пример, как указывать перезаписанные формы, но файл config/services.yaml остался на месте.