2013-06-20 11 views
8

私のアプリケーションのログイン画面でロケール切り替えが動作するようにしようとしています。そのためには、ログインページにsite.com/(デフォルトロケール)とsite.com/en(私がサポートしている2番目のロケール)を指すリンクがあります。私がログインしたらすぐ、切り替えは魅力的に機能します。しかし、まだ認証されていなければ、ログインは常にデフォルトのロケールに戻ります。私が理解していたのは、FOSUserBundleの名前付きルートを使用すると、自動的にロケールを処理できるはずですが、動作させることはできません。FOSUserBundleのログイン時のロケールスイッチ

マイアプリ/設定/ security.ymlファイル

security: 
    encoders: 
     FOS\UserBundle\Model\UserInterface: sha512 

    role_hierarchy: 
     ROLE_ADMIN:  ROLE_USER 
     ROLE_SUPER_ADMIN: ROLE_ADMIN 

    providers: 
     fos_userbundle: 
      id: fos_user.user_provider.username 

    firewalls: 
     main: 
      pattern: ^/ 
      form_login: 
       provider: fos_userbundle 
       csrf_provider: form.csrf_provider 
       login_path: fos_user_security_login 
       check_path: fos_user_security_check 
      logout:  true 
      anonymous: true 

    access_control: 
     - { path: ^/_wdt, roles: IS_AUTHENTICATED_ANONYMOUSLY }   # allow wdt for debugging 
     - { path: ^/_profiler/, role: IS_AUTHENTICATED_ANONYMOUSLY } # allow profiler for debugging 
     - { path: ^/bundles/, role: IS_AUTHENTICATED_ANONYMOUSLY }  # allow assets to be loaded anonymously 

     - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/admin, role: ROLE_ADMIN } 
     - { path: ^/, role: ROLE_USER } 

マイアプリ/設定/のrouting.yml

# FOS User bundle 
fos_user_security: 
    resource: "@FOSUserBundle/Resources/config/routing/security.xml" 

fos_user_profile: 
    resource: "@FOSUserBundle/Resources/config/routing/profile.xml" 
    prefix: /profile 

#fos_user_register: 
# resource: "@FOSUserBundle/Resources/config/routing/registration.xml" 
# prefix: /register 

fos_user_resetting: 
    resource: "@FOSUserBundle/Resources/config/routing/resetting.xml" 
    prefix: /resetting 

fos_user_change_password: 
    resource: "@FOSUserBundle/Resources/config/routing/change_password.xml" 
    prefix: /profile 

私はのカップルのためにこれで立ち往生してきたように感謝任意のポインタ今のところ

答えて

7

ロケール検出/スイッチの処理方法はわかりませんが、JMSI18nRoutingBundleでは以下のようにすることができます。

composer.jsonに必要なバンドルを追加します。

"require": { 
    ... 
    "jms/i18n-routing-bundle": "1.1.*", 
    "jms/translation-bundle": "1.1.*", 
    "friendsofsymfony/user-bundle": "1.3.*" 
}, 

設定バンドル:

jms_i18n_routing: 
    default_locale: en 
    locales: [en, fr, it, sp] 
    strategy: prefix 

ブートストラップバンドル:

$bundles = array(
    ... 
    new JMS\I18nRoutingBundle\JMSI18nRoutingBundle(), 
    new FOS\UserBundle\FOSUserBundle(), 
); 

変更希望のロケールとそれらを接頭辞ルートを既存の:

access_control: 
    # Routes are prefixed by ther user locale. 
    - { path: ^/[^/]+/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/[^/]+/register, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/[^/]+/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/[^/]+/admin, role: ROLE_ADMIN } 
    - { path: ^/[^/]+/, role: ROLE_USER } 

これで動作するはずです。

+0

おかげで、私は来週、このアプローチをしようとします。 –

+0

この設定を使用して多言語サイトを設定しました。私のログインページはすべての言語で利用可能です。ログイン後にロケールなしでフロントページにリダイレクトされます。何か案は? – ferdynator

10

ソリューションはFOSUserBundleのルートの輸入にロケールを接頭辞になってしまっ:

# FOS User bundle 
fos_user_security: 
    resource: "@FOSUserBundle/Resources/config/routing/security.xml" 
    prefix: /{_locale} 

fos_user_profile: 
    resource: "@FOSUserBundle/Resources/config/routing/profile.xml" 
    prefix: /{_locale}/profile 

fos_user_register: 
    resource: "@FOSUserBundle/Resources/config/routing/registration.xml" 
    prefix: /{_locale}/register 

fos_user_resetting: 
    resource: "@FOSUserBundle/Resources/config/routing/resetting.xml" 
    prefix: /{_locale}/resetting 

fos_user_change_password: 
    resource: "@FOSUserBundle/Resources/config/routing/change_password.xml" 
    prefix: /{_locale}/profile 

も匿名のルートでロケールを許可し、logout_pathを設定するには、ファイアウォールを変更します。

security: 
    encoders: 
     FOS\UserBundle\Model\UserInterface: sha512 

    role_hierarchy: 
     ROLE_ADMIN:  ROLE_USER 
     ROLE_SUPER_ADMIN: ROLE_ADMIN 

    providers: 
     fos_userbundle: 
      id: fos_user.user_provider.username 

    firewalls: 
     main: 
      pattern: ^/ 
      form_login: 
       provider: fos_userbundle 
       csrf_provider: form.csrf_provider 
       login_path: fos_user_security_login 
       check_path: fos_user_security_check 
      logout: 
       path: fos_user_security_logout 
      anonymous: true 

    access_control: 
     - { path: ^/_wdt, roles: IS_AUTHENTICATED_ANONYMOUSLY }   # allow wdt for debugging 
     - { path: ^/_profiler/, role: IS_AUTHENTICATED_ANONYMOUSLY } # allow profiler for debugging 
     - { path: ^/bundles/, role: IS_AUTHENTICATED_ANONYMOUSLY }  # allow assets to be loaded anonymously 

     - { path: ^/[a-z]+/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/[a-z]+/register, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/[a-z]+/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/admin, role: ROLE_ADMIN } 
     - { path: ^/, role: ROLE_USER } # this must be the last match, as url patterns are checked in the order they appear 

JMSI18nRoutingBundleを使用すると、おそらく長期的には良いでしょうが、試してみるとソリューションのドロップとして機能しませんでした。このプロジェクトの予算では、理由がわからなくなってしまいました。将来のアップデート。

2

私の解決策: be_simple_i18nタイプの形式のfos_userルートを再定義する必要があります。 (私はYAMLバージョンを選択した):

アプリケーション/リソース/設定/ルーティング/ fos_user_i18n.ymlにおけるAPP /設定/のrouting.yml

[...] 
#register the path to the file with the be_simple_i18n type fos_user routes 
fos_user:  
    resource: "config/routing/fos_user_i18n.yml" 
    type: be_simple_i18n 

my_yaml_i18n_routes: 
    resource: "config/routing/i18n.yml" 
    type: be_simple_i18n 

で:アプリで

#you have to make entries for all the fos_user routes here! 
#you can find them all in vendor/friendsofsymfony/user-bundle/Resources/routing 
fos_user_security_login: 
    locales: { en: "/login", de: "/anmelden" } 
    defaults: { _controller: FOSUserBundle:Security:login } 
fos_user_security_check: 
    locales: { en: "/login_check", de: "/login_pruefung" } 
    defaults: { _controller: FOSUserBundle:Security:check } 
#... 

/config/security.yml

firewalls:  
    [...] 

    main: 
     pattern: ^/ 
     form_login: 
      provider: fos_userbundle 
      login_path: fos_user_security_login 
      check_path: fos_user_security_check 
      csrf_provider: security.csrf.token_manager # Use form.csrf_provider instead for Symfony <2.4 

     logout: 
      path: fos_user_security_logout 
      target: #where_no_one_has_gone_before 
     [...] 

access_control: 
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/anmelden$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/registrieren, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    [...] 
0

私はこの問題を少しでも苦労しています。私は、適切なローカライズされたページにリダイレクトされるように、純粋なログイン(セッションのURLなし)をしたいと思っていました。 私はsymfonyのドキュメントの答えを見つけることができる:私はこのプロジェクトに戻ったときにJMSバンドルの先端のための

# app/config/security.yml 
security: 
# ... 
firewalls: 
    main: 
     form_login: 
      # ... 
      default_target_path: index [ or your named route ] 
+0

こんにちは、あなたの答えをありがとう、関連リソースへのリンクを投稿できますか? –

関連する問題