Skip to content

Commit

Permalink
[HttpKernel] fixed locale management when exiting sub-requests
Browse files Browse the repository at this point in the history
This fix is temporary as #7007 will fix it properly in Symfony 2.3.
  • Loading branch information
fabpot committed Feb 19, 2013
1 parent 98d5750 commit 3e40c17
Showing 1 changed file with 25 additions and 7 deletions.
32 changes: 25 additions & 7 deletions src/Symfony/Component/HttpKernel/EventListener/LocaleListener.php
Expand Up @@ -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;

Expand All @@ -25,33 +27,49 @@ class LocaleListener implements EventSubscriberInterface
{
private $router;
private $defaultLocale;
private $locales = array();

public function __construct($defaultLocale = 'en', RequestContextAwareInterface $router = null)
{
$this->defaultLocale = $defaultLocale;
$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()
{
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());
}
}
}

0 comments on commit 3e40c17

Please sign in to comment.