Skip to content

Commit

Permalink
added a cookie setting listener to remember a users language when no …
Browse files Browse the repository at this point in the history
…host map is used
  • Loading branch information
schmittjoh committed Apr 11, 2012
1 parent e476bbd commit 62b8384
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 0 deletions.
6 changes: 6 additions & 0 deletions DependencyInjection/JMSI18nRoutingExtension.php
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -67,6 +67,12 @@ public function load(array $configs, ContainerBuilder $container)
->getDefinition('jms_i18n_routing.locale_resolver.default') ->getDefinition('jms_i18n_routing.locale_resolver.default')
->addArgument(array_flip($config['hosts'])) ->addArgument(array_flip($config['hosts']))
; ;
} else {
$container
->getDefinition('jms_i18n_routing.cookie_setting_listener')
->setPublic(true)
->addTag('kernel.event_listener', array('event' => 'kernel.response', 'priority' => 256))
;
} }


// remove route extractor if JMSTranslationBundle is not enabled to avoid any problems // remove route extractor if JMSTranslationBundle is not enabled to avoid any problems
Expand Down
32 changes: 32 additions & 0 deletions EventListener/CookieSettingListener.php
Original file line number Original file line Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

namespace JMS\I18nRoutingBundle\EventListener;

use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;

/**
* Sets the user's language as a cookie.
*
* This is necessary if you are not using a host map, and still would like to
* use Varnish in front of your Symfony2 application.
*
* @author Johannes M. Schmitt <schmittjoh@gmail.com>
*/
class CookieSettingListener
{
public function onKernelResponse(FilterResponseEvent $event)
{
if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
return;
}

$request = $event->getRequest();

if (!$request->cookies->has('hl')
|| $request->cookies->get('hl') !== $request->getLocale()) {
$event->getResponse()->headers->setCookie(new Cookie('hl', $request->getLocale(), time() + 86400 * 365));
}
}
}
1 change: 1 addition & 0 deletions EventListener/LocaleChoosingListener.php
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ public function onKernelException(GetResponseForExceptionEvent $event)
} }


$locale = $this->localeResolver->resolveLocale($request, $this->locales) ?: $this->defaultLocale; $locale = $this->localeResolver->resolveLocale($request, $this->locales) ?: $this->defaultLocale;
$request->setLocale($locale);
$event->setResponse(new RedirectResponse($request->getBaseUrl().'/'.$locale.'/')); $event->setResponse(new RedirectResponse($request->getBaseUrl().'/'.$locale.'/'));
} }
} }
3 changes: 3 additions & 0 deletions Resources/config/services.xml
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
<parameter key="jms_i18n_routing.pattern_generation_strategy.class">JMS\I18nRoutingBundle\Router\DefaultPatternGenerationStrategy</parameter> <parameter key="jms_i18n_routing.pattern_generation_strategy.class">JMS\I18nRoutingBundle\Router\DefaultPatternGenerationStrategy</parameter>


<parameter key="jms_i18n_routing.locale_choosing_listener.class">JMS\I18nRoutingBundle\EventListener\LocaleChoosingListener</parameter> <parameter key="jms_i18n_routing.locale_choosing_listener.class">JMS\I18nRoutingBundle\EventListener\LocaleChoosingListener</parameter>
<parameter key="jms_i18n_routing.cookie_setting_listener.class">JMS\I18nRoutingBundle\EventListener\CookieSettingListener</parameter>


<parameter key="jms_i18n_routing.route_translation_extractor.class">JMS\I18nRoutingBundle\Translation\RouteTranslationExtractor</parameter> <parameter key="jms_i18n_routing.route_translation_extractor.class">JMS\I18nRoutingBundle\Translation\RouteTranslationExtractor</parameter>
</parameters> </parameters>
Expand Down Expand Up @@ -42,6 +43,8 @@
<argument type="service" id="jms_i18n_routing.locale_resolver" /> <argument type="service" id="jms_i18n_routing.locale_resolver" />
</service> </service>


<service id="jms_i18n_routing.cookie_setting_listener" class="%jms_i18n_routing.cookie_setting_listener.class%" public="false" />

<service id="jms_i18n_routing.route_exclusion_strategy" class="%jms_i18n_routing.route_exclusion_strategy.class%" public="false" /> <service id="jms_i18n_routing.route_exclusion_strategy" class="%jms_i18n_routing.route_exclusion_strategy.class%" public="false" />


<service id="jms_i18n_routing.pattern_generation_strategy.default" class="%jms_i18n_routing.pattern_generation_strategy.class%" public="false"> <service id="jms_i18n_routing.pattern_generation_strategy.default" class="%jms_i18n_routing.pattern_generation_strategy.class%" public="false">
Expand Down
15 changes: 15 additions & 0 deletions Tests/Functional/PrefixStrategyTest.php
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -42,4 +42,19 @@ public function getLocaleChoosingTests()
array('fr;q=0.5', 'en'), array('fr;q=0.5', 'en'),
); );
} }

public function testLanguageCookieIsSet()
{
$client = $this->createClient(array('config' => 'strategy_prefix.yml'));
$client->insulate();

$client->request('GET', '/?hl=de');

$response = $client->getResponse();
$this->assertTrue($response->isRedirect('/de/'), (string) $response);

$cookies = $response->headers->getCookies();
$this->assertSame(2, count($cookies));
$this->assertSame('de', $cookies[0]->getValue());
}
} }

0 comments on commit 62b8384

Please sign in to comment.