2017-10-13 68 views
2

我将Symfony 3.3与JMSI18nRoutingBundle一起使用。通过JMSI18nRoutingBundle在URL中的Symfony区域设置

该包将用户区域设置放在路由前面。这工作正常,直到我必须登录或注销,这些不起作用。

我总是得到以下错误:

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},。*,并且只是一个斜杠(/),但这些都不起作用。

管理,注销在我的routing.yml配置:

admin-logout: 
    path: /admin/logout 

它被作为树枝渲染得当,使用路径时(“管理 - 退出”),我得到一个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

login_pathcheck_path在使用路径时不支持占位符(即, /xy/{z})。

您需要使用路由名称 plus为任何占位符定义默认值。

The login_path and check_path can also be route names (but cannot have mandatory wildcards - e.g. /login/{foo} where foo has no default value).

(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 
+0

非常感谢!这是我需要的。 我没有更改我的routing.yml中的任何内容,但是在我的security.yml中使用了路由名(正如你所建议的那样),这就是所需要的 – Didier