[HttpKernel] fixed locale management when exiting sub-requests

This fix is temporary as #7007 will fix it properly in Symfony 2.3.
This commit is contained in:
Fabien Potencier 2013-02-17 16:59:21 +01:00
parent 98d57500f2
commit 3e40c176bd

View File

@ -12,7 +12,9 @@
namespace Symfony\Component\HttpKernel\EventListener;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\RequestContextAwareInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
@ -25,6 +27,7 @@ class LocaleListener implements EventSubscriberInterface
{
private $router;
private $defaultLocale;
private $locales = array();
public function __construct($defaultLocale = 'en', RequestContextAwareInterface $router = null)
{
@ -32,19 +35,24 @@ class LocaleListener implements EventSubscriberInterface
$this->router = $router;
}
public function onKernelResponse(FilterResponseEvent $event)
{
array_shift($this->locales);
// setting back the locale to the previous value
$locale = isset($this->locales[0]) ? $this->locales[0] : $this->defaultLocale;
$request = $event->getRequest();
$this->setLocale($request, $locale);
}
public function onKernelRequest(GetResponseEvent $event)
{
$request = $event->getRequest();
$request->setDefaultLocale($this->defaultLocale);
$this->setLocale($request, $request->attributes->get('_locale', $this->defaultLocale));
if ($locale = $request->attributes->get('_locale')) {
$request->setLocale($locale);
}
if (null !== $this->router) {
$this->router->getContext()->setParameter('_locale', $request->getLocale());
}
array_unshift($this->locales, $request->getLocale());
}
public static function getSubscribedEvents()
@ -52,6 +60,16 @@ class LocaleListener implements EventSubscriberInterface
return array(
// must be registered after the Router to have access to the _locale
KernelEvents::REQUEST => array(array('onKernelRequest', 16)),
KernelEvents::RESPONSE => 'onKernelResponse',
);
}
private function setLocale(Request $request, $locale)
{
$request->setLocale($locale);
if (null !== $this->router) {
$this->router->getContext()->setParameter('_locale', $request->getLocale());
}
}
}