私がやりたいのは、ユーザーのブラウザーの言語を検出し、URLにロケールを含むページにユーザーをリダイレクトすることです。
カーネルリスナーを登録するのが一番簡単な方法だと思いました。それが私がしたことです:
services:
kernel__request_listener:
class: Me\MainBundle\Listener\KernelRequestListener
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
calls:
- [ setContainer, [ @service_container ] ]
KernelRequestListener.php
...
/**
* @Service
*/
class KernelRequestListener
{
/**
* @Observe("kernel.request")
*/
public function onKernelRequest( GetResponseEvent $response )
{
if( $newLocale = $this->newLocale() )
{
$parmArray = $request->get('_route_params');
$parmArray['_locale'] = $newLocale;
$redirectResponse = new RedirectResponse( $this->getContainer()->get('router')->generate($request->get('_route'), $parmArray) );
$redirectResponse->headers->setCookie( new Cookie('b_locale', $newLocale, time() + 2592000) );
$response->setResponse( $redirectResponse );
}
}
...
}
$ this-> newLocale()メソッドは、ユーザーを別の言語にリダイレクトする必要があるかどうかを検出し、新しい言語コード(つまり、DEまたはFR)を返します。
ここで問題が発生します。私はasseticsを使用してjsファイルを圧縮し、jms/i18n-routing-bundleを使用してロケールベースのルーティングを実行しています。カーネルリスナーがロケールを切り替えると、ページはjsファイルの読み込みを繰り返し開始します。また、いくつかのページ(つまり、プロファイラー、ログイン/ログアウトなど)があり、意味がないか、問題が発生するため、リダイレクトを実行しないでください。
カーネルリスナーはそのようなリダイレクトを行うのに適切な場所ですか、それとももっと良い場所がありますか。上記の問題を解決するにはどうすればよいですか?