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