2017-10-13 15 views
2

私はJMSI18nRoutingBundleと一緒にSymfony 3.3を使用しています。JMSI18nRoutingBundle経由のURLのsymfonyロケール

バンドルは、ユーザーロケールをルートの前に置きます。これは正常に動作します。ログインするかログアウトするまで、これらは動作しません。

私はいつも次のエラーを取得する:

Unable to find the controller for path "/en/admin/logout". The route is wrongly configured. 

これは、ログイン/ログアウトカバーする私のsecurity.ymlファイルの一部です:などlogin_pathについては

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 } 

を、check_path、私はしました{_locale}、。*、スラッシュ(/)の代わりに試してみましたが、これらのどれも動作しませんでした。

管理者ログアウトが私のrouting.ymlで構成された

admin-logout: 
    path: /admin/logout 

これが適切に小枝にレンダリングされる、パスを使用して(「管理者ログアウト」)、私はそれでロケールでURLを取得しますそれをクリックすると、上記のエラーメッセージが再び表示されます。 ログインも動作しませんが、ログインページを表示することはできますが、ログイン後にページを更新するだけです。

ログイン/ログアウトを再度行う方法はありますか?


編集:私はそれを解決することができnifrする

おかげで、私はsecurity.ymlファイルでルート名ではなく、パスを使用していたはずです、これは私がなってしまったものです。

/EN /:あなたはそこに{から_locate}を入れない場合JMSI18nRoutingBundleはすでにあなたのようなルートで終わる、(ルートの前にロケールのプレースホルダを置くように私は、私のrouting.ymlで何も変更しませんでした
security: 
    firewalls: 
     main: 
     anonymous: ~ 
     pattern: admin 
     form_login: 
      login_path: admin-login 
      check_path: admin-login 
     [...] 
     logout: 
      path: admin-logout 
      target: admin-login 

    [...] 

ja/admin /)

答えて

0

login_pathおよびcheck_pathは、使用時にプレースホルダをサポートしません。パス(つまり、 /xy/{z})。

のいずれかのプレースホルダのデフォルト値を定義して、のルート名を使用する必要があります。

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

関連する問題