2016-05-14 2 views
1

に取り組んでいない私はにsetLocale Symfony2のアプリケーション

。ロケールの変更「」粘着性を作るために、このtutorialの指示に従い、ユーザの要求にロケールを変更するアクションを作成した。

LocaleListenerクラス

<?php 
namespace AppBundle\EventListener; 

use Symfony\Component\HttpKernel\Event\GetResponseEvent; 
use Symfony\Component\HttpKernel\KernelEvents; 
use Symfony\Component\EventDispatcher\EventSubscriberInterface; 

class LocaleListener implements EventSubscriberInterface 
{ 
    private $defaultLocale; 

    public function __construct($defaultLocale = 'en') 
    { 
     $this->defaultLocale = $defaultLocale; 
    } 

    public function onKernelRequest(GetResponseEvent $event) 
    { 
     $request = $event->getRequest(); 
     if (!$request->hasPreviousSession()) { 
      return; 
     } 

     // try to see if the locale has been set as a _locale routing parameter 
     if ($locale = $request->attributes->get('_locale')) { 
      $request->getSession()->set('_locale', $locale); 
     } else { 
      // if no explicit locale has been set on this request, use one from the session 
      $request->setLocale($request->getSession()->get('_locale', $this->defaultLocale)); 
     } 
    } 

    public static function getSubscribedEvents() 
    { 
     return array(
      // must be registered after the default Locale listener 
      KernelEvents::REQUEST => array(array('onKernelRequest', 15)), 
     ); 
    } 
} 

ディレクトリ構造:

enter image description here

サービス

services: 
    app.locale_listener: 
      class: AppBundle\EventListener\LocaleListener 
      arguments: ['%kernel.default_locale%'] 
      tags: 
       - { name: kernel.event_subscriber } 

アクション

/** 
    * @Route("/change-locale/{locale}", name="change_locale", defaults={"locale" = "it"}) 
    */ 
    public function changeLocaleAction(Request $request) { 

     $request->setLocale('it'); 

     $ref = $request->headers->get('referer'); 
     return $this->redirect($ref); 
    } 

しかし、その動作していない、と私はすべてのエラーを取得しておりません。なぜ問題になるのでしょうか?

答えて

1

リクエストリスナーで_locale属性を要求していますが、ルート定義で属性がlocale(先頭にアンダースコアがないことに注意してください)が設定されています。

あなたはそれに応じてルート定義を更新する必要があります。

/** 
* @Route("/change-locale/{_locale}", name="change_locale", defaults={"_locale" = "it"}) 
*/ 
public function changeLocaleAction(Request $request) 
{ 
    // ... 
} 
+0

'locale'がちょうどスラグです。 'setLocale'メソッドで何か問題があります。 – jihn

+0

この場合、ロケールリスナーはかなり役に立たなくなります。 'setLocale()'メソッドを呼び出した後に、正確に何が起こると思いますか? – xabbuh

+0

毎回リクエストごとに '_locale'パラメータも送ってください。 – jihn

関連する問題