Я использую UserBundle, который переопределяет FosUserBundle, там я поставил users
префикса для всех моих маршрутов пользователей:
// UserBundle/Resources/config/routing/all.xml
...
<import
resource="@FooUserBundle/Resources/config/routing/security.xml"
prefix="/users/" />
<import
resource="@FooUserBundle/Resources/config/routing/profile.xml"
prefix="/users/profile" />
<import
resource="@FooUserBundle/Resources/config/routing/registration.xml"
prefix="/users/register" />
...
Если я проверю маршруты с помощью php app/console route:debug
, они отображаются с ожидаемым префиксом:
fos_user_security_login ANY ANY ANY /users/login
fos_user_security_check POST ANY ANY /users/login_check
fos_user_security_logout ANY ANY ANY /users/logout
fos_user_registration_register ANY ANY ANY /users/register/
Я использую следующий URL-адрес, чтобы показать форму входа:
Http://www.foo.local/app_dev.php/users/login
Чтобы управлять отправкой, я использую этот путь в шаблоне ветки:
<form action="{{ path("fos_user_security_check") }}" method="post">
Что генерирует желаемый URL-адрес действия после обработки шаблона:
<form action="/app_dev.php/users/login_check" method="post">
Моя конфигурация security.yml такова:
providers:
fos_userbundle:
id: fos_user.user_provider.username
firewalls:
main:
pattern: ^/
form_login:
check_path: fos_user_security_check
provider: fos_userbundle
csrf_provider: form.csrf_provider
logout: true
anonymous: true
Однако, если я зарегистрирую пользователя с использованием этой формы, он перенаправляет меня на http://www.foo.local/app_dev.php/login, а не Http://www.foo.local/app_dev.php/users/login, давая "не найденную ошибку маршрута"
Как я могу это исправить?
FOSUserBundle не обрабатывает логин. Это делается компонентом Security. Таким образом, FOSUserBundle не имеет возможности изменить его, поскольку он не отвечает за поведение по умолчанию.
Вход в форму позволяет настроить перенаправление после входа в систему: http://symfony.com/doc/current/cookbook/security/form_login.html#redirecting-after-success
Я вижу два способа сделать это:
используйте специальный обработчик (более чистый, но более сложный и еще не документированный в официальном документе), установите перенаправление после входа на фиксированный путь (как описано в документе) с повторным перенаправлением контроллера.