2016-04-15 12 views
0

状況

私はこのようなkernel.requestに聞いてリスナーにロケールを設定しています:Symfony2のロケール

<?php 
// ... 
class LocaleListener 
{ 
    //... 
    public function onKernelRequest(GetResponseEvent $event) 
    { 
     $request = $event->getRequest(); 
     if (!$event->isMasterRequest()) { 
      return; 
     } 

     // [...] some logic to get $locale 
     $request->setLocale($locale); 
    } 
} 
?> 

その後、私は2つの小枝テンプレート、ベースとベース - を持っています拡張テンプレート。ベーステンプレート(base.html.twig):

<html> 
<body> 
    {{ 'some.translation'|trans({}, 'messages') }} 

    {% block body %}{% endblock %} 
</body> 
</html> 

とベース延びるテンプレート(profile.html.twig):

<?php 
// ... 
class SomeController extends Controller 
{ 
    //... 
    public function someAction() 
    { 
     return $this->render('::profile.html.twig'); 
    } 
} 
?> 

{% extends '::base.html.twig' %} 

{% block body %} 
    {{ 'some.translation'|trans({}, 'messages') }} 
{% endblock %} 

経路のコントローラprofile.html.twigをレンダリングします

何も特別なものはなく、すべて非常に簡単です...

問題

ベースを拡張したレンダリングされたテンプレート(profile.html.twig)は、リスナー内の翻訳セットのロケールを使用しています。残念ながら、基本テンプレート(base.html.twig)はありません。 {{ dump(app.request.locale) }}をベーステンプレートにダンプしても、リスナーに正しいロケールが設定されています。

私は何をすべきですか?


編集

ああ、私はsymfonyのv2.7.11を使用しています。

+1

それはキャッシュの問題だろうか?おそらく、 'app/cache/dev'や' app/cache/prod'をクリアしてみてください。ロケールについては、イベント優先度を確認してください。 [LocaleListenerの作成](http://symfony.com/doc/current/cookbook/session/locale_sticky_session.html#creating-a-localelistener)には、ここでさらに注意する必要があることが述べられています(行番号36を参照)。 – Yoshi

+0

優先順位について:あなたのリスナーは 'LocaleListener'と' TranslatorListener'の両方の後に登録されなければならないので、 '<= 9' – Federkun

答えて

1

解決策:正確に文書化されたhere(ヨシのヒント)のようにLocaleListenerを作成しました。

補遺:私は、ユーザーのエンティティに保存されているロケールを使用することを望んでいたので、私はInteractiveLoginListenerclass file)を作成する必要がありました。バージョン1.3.6の時点では、(2.0-αは、文書化されていないにもかかわらず、など)がありますイベントが注入されなければならなかったsecurity.interactive_loginと呼ばれる:

app.interactive_login_listener: 
    class: AppBundle\EventListener\Security\InteractiveLoginListener 
    arguments: ['@fos_user.user_manager', '@session'] 
    tags: 
     - { name: 'kernel.event_listener', event: 'security.interactive_login', method: 'onSecurityInteractiveLogin' }