2017-10-13 93 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