Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 824925f

Browse files
committed
Added a query guesser, removed from routerguesser, set locale on request
1 parent b63ad17 commit 824925f

11 files changed

Lines changed: 224 additions & 65 deletions

File tree

DependencyInjection/Configuration.php

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,6 @@ public function getConfigTreeBuilder()
4747
->scalarNode('class')
4848
->defaultValue('Lunetics\LocaleBundle\LocaleGuesser\RouterLocaleGuesser')
4949
->end()
50-
->booleanNode('check_query')
51-
->defaultTrue()
52-
->end()
5350
->end()
5451
->end()
5552
->arrayNode('browser_guesser')
@@ -76,6 +73,14 @@ public function getConfigTreeBuilder()
7673
->end()
7774
->end()
7875
->end()
76+
->arrayNode('query_guesser')
77+
->addDefaultsIfNotSet()
78+
->children()
79+
->scalarNode('class')
80+
->defaultValue('Lunetics\LocaleBundle\LocaleGuesser\QueryLocaleGuesser')
81+
->end()
82+
->end()
83+
->end()
7984
->arrayNode('cookie')
8085
->addDefaultsIfNotSet()
8186
->children()
@@ -96,10 +101,17 @@ public function getConfigTreeBuilder()
96101
->scalarNode('variable')->defaultValue('lunetics_locale')->end()
97102
->end()
98103
->end()
104+
->arrayNode('query')
105+
->addDefaultsIfNotSet()
106+
->children()
107+
->scalarNode('parameter_name')->defaultValue('_locale')->end()
108+
->end()
109+
->end()
99110
->arrayNode('switcher')
100111
->addDefaultsIfNotSet()
101112
->children()
102113
->scalarNode('template')->defaultValue('links')->end()
114+
->scalarNode('show_current_locale')->defaultFalse()->end()
103115
->end()
104116
->end();
105117

EventListener/LocaleListener.php

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ public function __construct($defaultLocale = 'en', LocaleGuesserManager $guesser
8484
*/
8585
public function onKernelRequest(GetResponseEvent $event)
8686
{
87+
/** @var $request \Symfony\Component\HttpFoundation\Request */
8788
$request = $event->getRequest();
8889

8990
if ($event->getRequestType() !== HttpKernelInterface::MASTER_REQUEST && !$request->isXmlHttpRequest()) {
@@ -93,20 +94,28 @@ public function onKernelRequest(GetResponseEvent $event)
9394
}
9495

9596
$manager = $this->guesserManager;
96-
if ($locale = $manager->runLocaleGuessing($request)) {
97+
98+
if ($result = $manager->runLocaleGuessing($request)) {
99+
$guesser = $result['guesser'];
100+
$locale = $result['locale'];
97101
$this->logEvent('Setting [ %s ] as defaultLocale for the Request', $locale);
98102
$request->setLocale($locale);
99103
$this->identifiedLocale = $locale;
100104

105+
$forceSet = in_array($guesser, array('query'));
106+
107+
if ($forceSet) {
108+
$this->logEvent('Force setting [ %s ]', $locale);
109+
}
101110
if (in_array('cookie', $manager->getGuessingOrder())) {
102-
if ($this->localeCookie->setCookieOnDetection() && !$request->cookies->has($this->localeCookie->getName())) {
111+
if ($this->localeCookie->setCookieOnDetection() && !$request->cookies->has($this->localeCookie->getName()) || $forceSet) {
103112
$this->addCookieResponseListener();
104113
}
105114
}
106115
if (in_array('session', $manager->getGuessingOrder())) {
107116
/** @var $session \Lunetics\LocaleBundle\LocaleGuesser\SessionLocaleGuesser */
108117
$session = $manager->getGuesser('session');
109-
$session->setSessionLocale($this->identifiedLocale);
118+
$session->setSessionLocale($this->identifiedLocale, $forceSet);
110119
}
111120

112121
return;

LocaleGuesser/LocaleGuesserManager.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ public function runLocaleGuessing(Request $request)
102102
$locale = $guesserService->getIdentifiedLocale();
103103
$this->logEvent('Locale has been identified by guessing service: ( %s )', ucfirst($guesser));
104104

105-
return $locale;
105+
return array('guesser' => $guesser, 'locale' => $locale);
106106
}
107107
$this->logEvent('Locale has not been identified by the %s guessing service', ucfirst($guesser));
108108
}
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
<?php
2+
/**
3+
* This file is part of the LuneticsLocaleBundle package.
4+
*
5+
* <https://github.com/lunetics/LocaleBundle/>
6+
*
7+
* For the full copyright and license information, please view the LICENSE
8+
* file that is distributed with this source code.
9+
*/
10+
namespace Lunetics\LocaleBundle\LocaleGuesser;
11+
12+
use Symfony\Component\HttpFoundation\Request;
13+
use Lunetics\LocaleBundle\Validator\MetaValidator;
14+
/**
15+
* This guesser class checks the session for a var
16+
*
17+
* @author Matthias Breddin <[email protected]>
18+
*/
19+
class QueryLocaleGuesser implements LocaleGuesserInterface
20+
{
21+
/**
22+
* @var string
23+
*/
24+
private $metaValidator;
25+
26+
/**
27+
* @var string
28+
*/
29+
private $identifiedLocale;
30+
31+
/**
32+
* @var Request
33+
*/
34+
private $request;
35+
36+
/**
37+
* Constructor
38+
*
39+
* @param MetaValidator $metaValidator MetaValidator
40+
* @param string $queryParameterName Query parameter used
41+
*/
42+
public function __construct(MetaValidator $metaValidator, $queryParameterName = '_locale')
43+
{
44+
$this->queryParameterName = $queryParameterName;
45+
$this->metaValidator = $metaValidator;
46+
}
47+
48+
/**
49+
* Guess the locale based on the session variable
50+
*
51+
* @param Request $request
52+
*
53+
* @return boolean
54+
*/
55+
public function guessLocale(Request $request)
56+
{
57+
$localeValidator = $this->metaValidator;
58+
if ($request->query->has($this->queryParameterName)) {
59+
if ($localeValidator->isAllowed($request->query->get($this->queryParameterName))) {
60+
$this->identifiedLocale = $request->query->get($this->queryParameterName);
61+
62+
return true;
63+
}
64+
}
65+
66+
return false;
67+
}
68+
69+
/**
70+
* {@inheritDoc}
71+
*/
72+
public function getIdentifiedLocale()
73+
{
74+
if (null === $this->identifiedLocale) {
75+
return false;
76+
}
77+
78+
return $this->identifiedLocale;
79+
}
80+
}

LocaleGuesser/RouterLocaleGuesser.php

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,6 @@
2020
*/
2121
class RouterLocaleGuesser implements LocaleGuesserInterface
2222
{
23-
/**
24-
* @var bool
25-
*/
26-
private $checkQuery;
27-
2823
/**
2924
* @var string
3025
*/
@@ -39,12 +34,10 @@ class RouterLocaleGuesser implements LocaleGuesserInterface
3934
* Constructor
4035
*
4136
* @param MetaValidator $metaValidator MetaValidator
42-
* @param boolean $checkQuery Wether to check the query for a locale
4337
*/
44-
public function __construct(MetaValidator $metaValidator, $checkQuery = true)
38+
public function __construct(MetaValidator $metaValidator)
4539
{
4640
$this->metaValidator = $metaValidator;
47-
$this->checkQuery = $checkQuery;
4841
}
4942

5043
/**
@@ -57,13 +50,6 @@ public function __construct(MetaValidator $metaValidator, $checkQuery = true)
5750
public function guessLocale(Request $request)
5851
{
5952
$localeValidator = $this->metaValidator;
60-
if ($this->checkQuery && $request->query->has('_locale')) {
61-
if ($localeValidator->isAllowed($request->query->get('_locale'))) {
62-
$this->identifiedLocale = $request->query->get('_locale');
63-
64-
return true;
65-
}
66-
}
6753
if ($locale = $request->attributes->get('_locale')) {
6854
if ($localeValidator->isAllowed($locale)) {
6955
$this->identifiedLocale = $locale;

LocaleGuesser/SessionLocaleGuesser.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,11 +90,12 @@ public function getIdentifiedLocale()
9090
/**
9191
* Sets the locale in the session
9292
*
93-
* @param string $locale
93+
* @param string $locale Locale
94+
* @param bool $force Force write session
9495
*/
95-
public function setSessionLocale($locale)
96+
public function setSessionLocale($locale, $force = false)
9697
{
97-
if (!$this->session->has($this->sessionVariable)) {
98+
if (!$this->session->has($this->sessionVariable) || $force) {
9899
$this->session->set($this->sessionVariable, $locale);
99100
}
100101
}

Resources/config/guessers.xml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,14 @@
44
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
55
<services>
66

7+
<service id="lunetics_locale.query_guesser" class="%lunetics_locale.query_guesser.class%">
8+
<argument type="service" id="lunetics_locale.validator.meta" />
9+
<argument>%lunetics_locale.query.parameter_name%</argument>
10+
<tag name="lunetics_locale.guesser" alias="query"/>
11+
</service>
12+
713
<service id="lunetics_locale.router_guesser" class="%lunetics_locale.router_guesser.class%">
814
<argument type="service" id="lunetics_locale.validator.meta" />
9-
<argument>%lunetics_locale.router_guesser.check_query%</argument>
1015
<tag name="lunetics_locale.guesser" alias="router"/>
1116
</service>
1217

Tests/EventListener/LocaleListenerTest.php

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Lunetics\LocaleBundle\LocaleGuesser\RouterLocaleGuesser;
1616
use Lunetics\LocaleBundle\LocaleGuesser\BrowserLocaleGuesser;
1717
use Lunetics\LocaleBundle\LocaleGuesser\CookieLocaleGuesser;
18+
use Lunetics\LocaleBundle\LocaleGuesser\QueryLocaleGuesser;
1819
use Lunetics\LocaleBundle\Cookie\LocaleCookie;
1920
use Lunetics\LocaleBundle\Validator\MetaValidator;
2021
use Symfony\Component\HttpFoundation\Request;
@@ -39,7 +40,20 @@ public function testDefaultLocaleWithoutParams()
3940
public function testCustomLocaleIsSetWhenParamsExist()
4041
{
4142
$listener = new LocaleListener('fr', $this->getGuesserManager(), $this->getLocaleCookie());
42-
$event = $this->getEvent($request = Request::create('/', 'GET', array('_locale' => 'de')));
43+
$request = Request::create('/', 'GET');
44+
$request->attributes->set('_locale', 'de');
45+
$event = $this->getEvent($request);
46+
47+
$listener->onKernelRequest($event);
48+
$this->assertEquals('de', $request->getLocale());
49+
}
50+
51+
public function testCustomLocaleIsSetWhenQueryExist()
52+
{
53+
$listener = new LocaleListener('fr', $this->getGuesserManager(array(0 => 'router', 1 => 'query', 2 => 'browser')), $this->getLocaleCookie());
54+
$request = Request::create('/', 'GET');
55+
$request->query->set('_locale', 'de');
56+
$event = $this->getEvent($request);
4357

4458
$listener->onKernelRequest($event);
4559
$this->assertEquals('de', $request->getLocale());
@@ -146,9 +160,11 @@ private function getGuesserManager($order = array(1 => 'router', 2 => 'browser')
146160
->will($this->returnCallback($callBack));
147161

148162
$manager = new LocaleGuesserManager($order);
149-
$routerGuesser = new RouterLocaleGuesser($metaValidator, true);
163+
$routerGuesser = new RouterLocaleGuesser($metaValidator);
150164
$browserGuesser = new BrowserLocaleGuesser($metaValidator);
151165
$cookieGuesser = new CookieLocaleGuesser($metaValidator, 'lunetics_locale');
166+
$queryGuesser = new QueryLocaleGuesser($metaValidator, '_locale');
167+
$manager->addGuesser($queryGuesser, 'query');
152168
$manager->addGuesser($routerGuesser, 'router');
153169
$manager->addGuesser($browserGuesser, 'browser');
154170
$manager->addGuesser($cookieGuesser, 'cookie');

Tests/LocaleGuesser/LocaleGuesserManagerTest.php

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
namespace Lunetics\LocaleBundle\Tests\LocaleGuesser;
1111

1212
use Lunetics\LocaleBundle\LocaleGuesser\RouterLocaleGuesser;
13+
use Lunetics\LocaleBundle\LocaleGuesser\QueryLocaleGuesser;
1314
use Lunetics\LocaleBundle\LocaleGuesser\LocaleGuesserManager;
1415
use Lunetics\LocaleBundle\LocaleGuesser\LocaleGuesserInterface;
1516
use Symfony\Component\HttpFoundation\Request;
@@ -25,7 +26,7 @@ public function testLocaleGuessingInvalidGuesser()
2526
$guesserManager->runLocaleGuessing($this->getRequestWithoutLocaleQuery());
2627
}
2728

28-
public function testLocaleIsIdentifiedByTheRouterGuessingService()
29+
public function testLocaleIsIdentifiedByTheQueryGuessingService()
2930
{
3031
$request = $this->getRequestWithLocaleQuery('fr');
3132
$metaValidator = $this->getMetaValidatorMock();
@@ -35,17 +36,18 @@ public function testLocaleIsIdentifiedByTheRouterGuessingService()
3536
->with('fr')
3637
->will($this->returnValue(true));
3738

38-
$order = array(0 => 'router', 1 => 'browser');
39+
$order = array(0 => 'query', 1 => 'router');
3940
$manager = new LocaleGuesserManager($order);
4041
$manager->addGuesser(new RouterLocaleGuesser($metaValidator), 'router');
42+
$manager->addGuesser(new QueryLocaleGuesser($metaValidator), 'query');
4143

4244
$guesserMock = $this->getGuesserMock();
4345
$guesserMock->expects($this->any())
4446
->method('guessLocale')
4547
->will($this->returnValue(false));
4648
$manager->addGuesser($guesserMock, 'browser');
4749
$guessing = $manager->runLocaleGuessing($request);
48-
$this->assertEquals('fr', $guessing);
50+
$this->assertEquals('fr', $guessing['locale']);
4951
}
5052

5153
public function testLocaleIsNotIdentifiedIfNoQueryParamsExist()
@@ -56,9 +58,10 @@ public function testLocaleIsNotIdentifiedIfNoQueryParamsExist()
5658
$metaValidator->expects($this->never())
5759
->method('isAllowed');
5860

59-
$order = array(0 => 'router', 1 => 'browser');
61+
$order = array(0 => 'query', 1 => 'router');
6062
$manager = new LocaleGuesserManager($order);
6163
$manager->addGuesser(new RouterLocaleGuesser($metaValidator), 'router');
64+
$manager->addGuesser(new QueryLocaleGuesser($metaValidator), 'query');
6265
$guesserMock = $this->getGuesserMock();
6366
$guesserMock->expects($this->any())
6467
->method('guessLocale')
@@ -70,7 +73,8 @@ public function testLocaleIsNotIdentifiedIfNoQueryParamsExist()
7073

7174
private function getRequestWithLocaleQuery($locale = 'en')
7275
{
73-
$request = Request::create(' / hello - world', 'GET', array('_locale' => $locale));
76+
$request = Request::create(' / hello - world', 'GET');
77+
$request->query->set('_locale', $locale);
7478

7579
return $request;
7680
}

0 commit comments

Comments
 (0)