fixed Request management for LocaleListener
This commit is contained in:
parent
a7b2b7e92b
commit
1b98ad34ff
@ -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>
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user