From 0908fd5a727c15a18cc9d2543294705915159f60 Mon Sep 17 00:00:00 2001 From: Matthias Breddin Date: Fri, 26 Oct 2012 17:07:17 +0200 Subject: [PATCH] Using EventSubscriber instead of Event Listener, because the LocaleListener must be called before the Symfony LocaleListener, which sets the locale in the router. --- EventListener/LocaleListener.php | 33 +++++++++++++++++++++----- EventListener/LocaleUpdateListener.php | 19 ++++++++++++++- Resources/config/services.xml | 6 ++--- 3 files changed, 48 insertions(+), 10 deletions(-) diff --git a/EventListener/LocaleListener.php b/EventListener/LocaleListener.php index 0c5d418..3511b48 100644 --- a/EventListener/LocaleListener.php +++ b/EventListener/LocaleListener.php @@ -15,6 +15,7 @@ use Symfony\Component\HttpKernel\Log\LoggerInterface; use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Component\HttpKernel\Event\FilterResponseEvent; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Lunetics\LocaleBundle\LocaleGuesser\LocaleGuesserManager; use Lunetics\LocaleBundle\Event\FilterLocaleSwitchEvent; @@ -26,7 +27,7 @@ * @author Christophe Willemsen * @author Matthias Breddin */ -class LocaleListener +class LocaleListener implements EventSubscriberInterface { /** * @var string Default framework locale @@ -77,6 +78,8 @@ public function onKernelRequest(GetResponseEvent $event) /** @var $request \Symfony\Component\HttpFoundation\Request */ $request = $event->getRequest(); + $request->setDefaultLocale($this->defaultLocale); + if ($event->getRequestType() !== HttpKernelInterface::MASTER_REQUEST && !$request->isXmlHttpRequest()) { $this->logEvent('Request is not a "MASTER_REQUEST" : SKIPPING...'); @@ -93,15 +96,21 @@ public function onKernelRequest(GetResponseEvent $event) $this->dispatcher->dispatch(LocaleBundleEvents::onLocaleChange, $localeSwitchEvent); } - $this->dispatcher->addListener(KernelEvents::RESPONSE, function(FilterResponseEvent $event) { - return $event->getResponse()->setVary('Accept-Language'); - }); - return; } - $request->setDefaultLocale($this->defaultLocale); } + /** + * This Listener adds a vary header to all responses. + * + * @param FilterResponseEvent $event + * + * @return \Symfony\Component\HttpFoundation\Response + */ + public function onLocaleDetectedSetVaryHeader(FilterResponseEvent $event) + { + return $event->getResponse()->setVary('Accept-Language'); + } /** * DI Setter for the EventDispatcher * @@ -124,4 +133,16 @@ private function logEvent($logMessage, $parameters = null) $this->logger->info(sprintf($logMessage, $parameters)); } } + + /** + * {@inheritDoc} + */ + public static function getSubscribedEvents() + { + return array( + // must be registered after the Router to have access to the _locale and before the Symfony LocaleListener + KernelEvents::REQUEST => array(array('onKernelRequest', 24)), + KernelEvents::RESPONSE => array('onLocaleDetectedSetVaryHeader') + ); + } } diff --git a/EventListener/LocaleUpdateListener.php b/EventListener/LocaleUpdateListener.php index 0fca6a4..69fa15a 100644 --- a/EventListener/LocaleUpdateListener.php +++ b/EventListener/LocaleUpdateListener.php @@ -15,17 +15,19 @@ use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Event\FilterResponseEvent; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Lunetics\LocaleBundle\Cookie\LocaleCookie; use Lunetics\LocaleBundle\Event\FilterLocaleSwitchEvent; use Lunetics\LocaleBundle\Session\LocaleSession; +use Lunetics\LocaleBundle\LocaleBundleEvents; /** * Locale Update Listener * * @author Matthias Breddin */ -class LocaleUpdateListener +class LocaleUpdateListener implements EventSubscriberInterface { /** * @var string @@ -96,6 +98,8 @@ public function onLocaleChange(FilterLocaleSwitchEvent $event) * Update Cookie Section * * @param bool $update If cookie should be updated + * + * @return bool */ public function updateCookie($update) { @@ -132,6 +136,8 @@ public function updateCookieOnResponse(FilterResponseEvent $event) /** * Update Session section + * + * @return bool */ public function updateSession() { @@ -158,4 +164,15 @@ private function checkGuesser($guesser) { return in_array($guesser, $this->registeredGuessers); } + + /** + * {@inheritDoc} + */ + public static function getSubscribedEvents() + { + return array( + // must be registered after the Router to have access to the _locale and before the Symfony LocaleListener + LocaleBundleEvents::onLocaleChange => array('onLocaleChange') + ); + } } diff --git a/Resources/config/services.xml b/Resources/config/services.xml index b8873d7..c905830 100644 --- a/Resources/config/services.xml +++ b/Resources/config/services.xml @@ -35,13 +35,13 @@ - %locale% + %kernel.default_locale% - + @@ -51,7 +51,7 @@ %lunetics_locale.guessing_order% - +