URL中的Symfony语言环境通过JMSI18nRoutingBundle

时间:2017-10-13 11:20:18

标签: php symfony security internationalization

我将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 /)

1 个答案:

答案 0 :(得分:0)

login_pathcheck_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