fixed Request management for LocaleListener

This commit is contained in:
Fabien Potencier 2013-02-06 22:21:56 +01:00
parent a7b2b7e92b
commit 1b98ad34ff
2 changed files with 13 additions and 21 deletions

View File

@ -38,6 +38,7 @@
<tag name="kernel.event_subscriber" />
<argument>%kernel.default_locale%</argument>
<argument type="service" id="router" on-invalid="ignore" />
<call method="setRequest"><argument type="service" id="request" on-invalid="null" strict="false" /></call>
</service>
</services>
</container>

View File

@ -12,7 +12,6 @@
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;
@ -27,7 +26,6 @@ class LocaleListener implements EventSubscriberInterface
{
private $router;
private $defaultLocale;
private $locales = array();
public function __construct($defaultLocale = 'en', RequestContextAwareInterface $router = null)
{
@ -35,24 +33,27 @@ class LocaleListener implements EventSubscriberInterface
$this->router = $router;
}
public function onKernelResponse(FilterResponseEvent $event)
public function setRequest(Request $request = null)
{
array_shift($this->locales);
if (null === $request) {
return;
}
// 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);
if ($locale = $request->attributes->get('_locale')) {
$request->setLocale($locale);
}
if (null !== $this->router) {
$this->router->getContext()->setParameter('_locale', $request->getLocale());
}
}
public function onKernelRequest(GetResponseEvent $event)
{
$request = $event->getRequest();
$request->setDefaultLocale($this->defaultLocale);
$this->setLocale($request, $request->attributes->get('_locale', $this->defaultLocale));
array_unshift($this->locales, $request->getLocale());
$this->setRequest($request);
}
public static function getSubscribedEvents()
@ -60,16 +61,6 @@ 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());
}
}
}