Определить локаль и изменить URL-адрес (перенаправить), чтобы включить локаль

Что я хочу сделать, так это определить язык браузера пользователя и перенаправить его на страницу, содержащую локаль в 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).

Здесь возникает проблема: я использую активы для сжатия файлов js и jms/i18n-routing-bundle для маршрутизации на основе локали. Когда прослушиватель ядра переключает локаль, страница снова и снова начинает загружать js-файлы. кроме того, есть несколько страниц (например, профилировщик, вход/выход и т. д.), на которых не должно происходить перенаправление, поскольку оно не имеет смысла или что-то ломает.

Является ли слушатель ядра подходящим местом для такого перенаправления или есть лучшее место. Как решить проблемы выше?


person madc    schedule 22.06.2012    source источник


Ответы (1)


Добавьте перед кодом:

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

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

    [CODE]
person webda2l    schedule 13.07.2012
comment
Конечно! Большое спасибо. Некоторую базовую информацию об этом можно найти даже в поваренной книге. - person madc; 14.07.2012