From 3e40c176bd2043369779c350f2845f49071fb3d7 Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Sun, 17 Feb 2013 16:59:21 +0100 Subject: [PATCH] [HttpKernel] fixed locale management when exiting sub-requests This fix is temporary as #7007 will fix it properly in Symfony 2.3. --- .../EventListener/LocaleListener.php | 32 +++++++++++++++---- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/src/Symfony/Component/HttpKernel/EventListener/LocaleListener.php b/src/Symfony/Component/HttpKernel/EventListener/LocaleListener.php index 529314b86d..f3cb804832 100644 --- a/src/Symfony/Component/HttpKernel/EventListener/LocaleListener.php +++ b/src/Symfony/Component/HttpKernel/EventListener/LocaleListener.php @@ -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()); + } + } }