我将Symfony 3.3与JMSI18nRoutingBundle结合使用。
bundle将用户区域设置放在路由前面。这很好,直到我必须登录或注销,这些都无法正常工作。
我总是收到以下错误:
Unable to find the controller for path "/en/admin/logout". The route is wrongly configured.
这是我的security.yml的一部分,涵盖登录/注销:
security:
firewalls:
main:
anonymous: ~
pattern: ^.*/admin
form_login:
login_path: /{_locale}/admin/login
check_path: /{_locale}/admin/login
[...]
logout:
path: /{_locale}/admin/logout
target: /{_locale}/admin/login
access_control:
- { path: ^/admin/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin, roles: ROLE_ADMIN }
对于login_path,check_path等,我也试过而不是{_locale},。*,只是斜杠(/),但这些都没有。
admin-logout在我的routing.yml中配置:
admin-logout:
path: /admin/logout
在使用路径(' admin-logout')时,这会正确呈现在twig中,我得到一个带有语言环境的URL,但是当我单击它时,它只会再次显示上面的错误消息。 登录也不起作用,但我可以显示登录页面,但输入凭据后,它只是刷新页面而没有登录。
任何人都知道如何让登录/登出再次运作?
编辑:
感谢nifr我可以解决它,我应该使用路由名称,而不是security.yml中的路径,这就是我最终的结果:
security:
firewalls:
main:
anonymous: ~
pattern: admin
form_login:
login_path: admin-login
check_path: admin-login
[...]
logout:
path: admin-logout
target: admin-login
[...]
我没有在routing.yml中更改任何内容,因为JMSI18nRoutingBundle已经将语言环境占位符放在路由前面(如果你确实放了{_locale},那么你最终得到的路由如下:/ en / en / admin /)
答案 0 :(得分:0)
login_path
和check_path
在使用路径(即/xy/{z}
)时不支持占位符。
您需要使用路由的名称,并为任何占位符定义默认值。
login_path和check_path也可以是路由名称(但不能有 强制性通配符 - 例如/ login / {foo}其中foo没有默认值 值)。
(Symfony文档 - How to Build a Traditional Login Form)
以下路由定义和安全配置示例可以使用:
# routing.yml
login_route_name:
path: /{_locale}/login
defaults:
_locale: 'en'
_controller: app.controller_service.security:login
login_check_route_name:
path: /{_locale}/login/check
defaults:
_locale: 'en'
_controller: app.controller_service.security:loginCheck
# security.yml
security:
firewalls:
firewall_name:
# [..]
form_login:
login_path: login_route_name
check_path: login_check_route_name
使用JMSi18nBundle时,您可以使用debug:router
命令找到登录/检查路由的名称。例如:
bin/console debug:router | grep -i login