【问题标题】:Symfony locale in URL via JMSI18nRoutingBundle通过 JMSI18nRoutingBundle 在 URL 中的 Symfony 语言环境
【发布时间】:2017-10-13 11:20:18
【问题描述】:

我将 Symfony 3.3 与 JMSI18nRoutingBundle 结合使用。

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

我总是收到以下错误:

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')时,我会得到一个包含语言环境的 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 /)

【问题讨论】:

    标签: php symfony security internationalization


    【解决方案1】:

    login_path 和 check_path 在使用 paths(即 /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
    

    【讨论】:

    • 非常感谢!这正是我所需要的。我没有更改我的 routing.yml 中的任何内容,但使用了我的 security.yml 中的路由名称(如您所建议的那样),这就是所需要的全部
    猜你喜欢
    • 2017-06-02
    • 2014-04-23
    • 2013-07-20
    • 2012-12-25
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多