3

私がやりたいのは、ユーザーのブラウザーの言語を検出し、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ファイルの読み込みを繰り返し開始します。また、いくつかのページ(つまり、プロファイラー、ログイン/ログアウトなど)があり、意味がないか、問題が発生するため、リダイレクトを実行しないでください。

カーネルリスナーはそのようなリダイレクトを行うのに適切な場所ですか、それとももっと良い場所がありますか。上記の問題を解決するにはどうすればよいですか?

4

1 に答える 1

3

Add, before your code:

public function onKernelRequest(GetResponseEvent $event)
{
    if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
        return;
    }

    $request = $event->getRequest();
    if ($request->getRequestFormat() !== 'html') {
        return;
    }

    [CODE]
于 2012-07-13T10:26:09.893 に答える