Skip to content

Commit d89864d

Browse files
Merge branch '4.4' into 5.0
* 4.4: (34 commits) Add test for tagged iterator with numeric index Fix container lint command when a synthetic service is used in combination with the expression language [Validator][Range] Fix typos [SecurityBundle] Minor fix in LDAP config tree builder [HttpClient] fix requests to hosts that idn_to_ascii() cannot handle [FrameworkBundle] remove redundant PHPDoc in console Descriptor and subclass [Mime] remove phpdoc mentioning Utf8AddressEncoder Add missing phpdoc Remove int return type from FlattenException::getCode [Yaml] fix dumping strings containing CRs [DI] Fix XmlFileLoader bad error message [Form] Handle false as empty value on expanded choices [Messenger] Add ext-redis min version req to tests Tweak message improve PlaintextPasswordEncoder docBlock summary [Validator] Add two missing translations for the Arabic (ar) locale Use some PHP 5.4 constants unconditionally Add new packages on the link script [DI] fix dumping errored definitions [DI] ignore extra tags added by autoconfiguration in PriorityTaggedServiceTrait ...
2 parents d6ca39f + b7e1fd1 commit d89864d

File tree

4 files changed

+108
-22
lines changed

4 files changed

+108
-22
lines changed

Route.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,10 @@ public function setDefaults(array $defaults)
361361
*/
362362
public function addDefaults(array $defaults)
363363
{
364+
if (isset($defaults['_locale']) && $this->isLocalized()) {
365+
unset($defaults['_locale']);
366+
}
367+
364368
foreach ($defaults as $name => $default) {
365369
$this->defaults[$name] = $default;
366370
}
@@ -398,6 +402,10 @@ public function hasDefault(string $name)
398402
*/
399403
public function setDefault(string $name, $default)
400404
{
405+
if ('_locale' === $name && $this->isLocalized()) {
406+
return $this;
407+
}
408+
401409
$this->defaults[$name] = $default;
402410
$this->compiled = null;
403411

@@ -441,6 +449,10 @@ public function setRequirements(array $requirements)
441449
*/
442450
public function addRequirements(array $requirements)
443451
{
452+
if (isset($requirements['_locale']) && $this->isLocalized()) {
453+
unset($requirements['_locale']);
454+
}
455+
444456
foreach ($requirements as $key => $regex) {
445457
$this->requirements[$key] = $this->sanitizeRequirement($key, $regex);
446458
}
@@ -476,6 +488,10 @@ public function hasRequirement(string $key)
476488
*/
477489
public function setRequirement(string $key, string $regex)
478490
{
491+
if ('_locale' === $key && $this->isLocalized()) {
492+
return $this;
493+
}
494+
479495
$this->requirements[$key] = $this->sanitizeRequirement($key, $regex);
480496
$this->compiled = null;
481497

@@ -544,4 +560,9 @@ private function sanitizeRequirement(string $key, string $regex)
544560

545561
return $regex;
546562
}
563+
564+
private function isLocalized(): bool
565+
{
566+
return isset($this->defaults['_locale']) && isset($this->defaults['_canonical_route']) && ($this->requirements['_locale'] ?? null) === preg_quote($this->defaults['_locale'], RouteCompiler::REGEX_DELIMITER);
567+
}
547568
}

Tests/Generator/Dumper/CompiledUrlGeneratorDumperTest.php

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,8 @@ public function testDumpWithRoutes()
8787
public function testDumpWithSimpleLocalizedRoutes()
8888
{
8989
$this->routeCollection->add('test', (new Route('/foo')));
90-
$this->routeCollection->add('test.en', (new Route('/testing/is/fun'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'test'));
91-
$this->routeCollection->add('test.nl', (new Route('/testen/is/leuk'))->setDefault('_locale', 'nl')->setDefault('_canonical_route', 'test'));
90+
$this->routeCollection->add('test.en', (new Route('/testing/is/fun'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'test')->setRequirement('_locale', 'en'));
91+
$this->routeCollection->add('test.nl', (new Route('/testen/is/leuk'))->setDefault('_locale', 'nl')->setDefault('_canonical_route', 'test')->setRequirement('_locale', 'nl'));
9292

9393
$code = $this->generatorDumper->dump();
9494
file_put_contents($this->testTmpFilepath, $code);
@@ -120,7 +120,7 @@ public function testDumpWithRouteNotFoundLocalizedRoutes()
120120
{
121121
$this->expectException('Symfony\Component\Routing\Exception\RouteNotFoundException');
122122
$this->expectExceptionMessage('Unable to generate a URL for the named route "test" as such route does not exist.');
123-
$this->routeCollection->add('test.en', (new Route('/testing/is/fun'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'test'));
123+
$this->routeCollection->add('test.en', (new Route('/testing/is/fun'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'test')->setRequirement('_locale', 'en'));
124124

125125
$code = $this->generatorDumper->dump();
126126
file_put_contents($this->testTmpFilepath, $code);
@@ -131,9 +131,9 @@ public function testDumpWithRouteNotFoundLocalizedRoutes()
131131

132132
public function testDumpWithFallbackLocaleLocalizedRoutes()
133133
{
134-
$this->routeCollection->add('test.en', (new Route('/testing/is/fun'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'test'));
135-
$this->routeCollection->add('test.nl', (new Route('/testen/is/leuk'))->setDefault('_locale', 'nl')->setDefault('_canonical_route', 'test'));
136-
$this->routeCollection->add('test.fr', (new Route('/tester/est/amusant'))->setDefault('_locale', 'fr')->setDefault('_canonical_route', 'test'));
134+
$this->routeCollection->add('test.en', (new Route('/testing/is/fun'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'test')->setRequirement('_locale', 'en'));
135+
$this->routeCollection->add('test.nl', (new Route('/testen/is/leuk'))->setDefault('_locale', 'nl')->setDefault('_canonical_route', 'test')->setRequirement('_locale', 'nl'));
136+
$this->routeCollection->add('test.fr', (new Route('/tester/est/amusant'))->setDefault('_locale', 'fr')->setDefault('_canonical_route', 'test')->setRequirement('_locale', 'fr'));
137137

138138
$code = $this->generatorDumper->dump();
139139
file_put_contents($this->testTmpFilepath, $code);
@@ -234,10 +234,10 @@ public function testDumpWithSchemeRequirement()
234234

235235
public function testDumpWithLocalizedRoutesPreserveTheGoodLocaleInTheUrl()
236236
{
237-
$this->routeCollection->add('foo.en', (new Route('/{_locale}/foo'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'foo'));
238-
$this->routeCollection->add('foo.fr', (new Route('/{_locale}/foo'))->setDefault('_locale', 'fr')->setDefault('_canonical_route', 'foo'));
239-
$this->routeCollection->add('fun.en', (new Route('/fun'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'fun'));
240-
$this->routeCollection->add('fun.fr', (new Route('/amusant'))->setDefault('_locale', 'fr')->setDefault('_canonical_route', 'fun'));
237+
$this->routeCollection->add('foo.en', (new Route('/{_locale}/fork'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'foo')->setRequirement('_locale', 'en'));
238+
$this->routeCollection->add('foo.fr', (new Route('/{_locale}/fourchette'))->setDefault('_locale', 'fr')->setDefault('_canonical_route', 'foo')->setRequirement('_locale', 'fr'));
239+
$this->routeCollection->add('fun.en', (new Route('/fun'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'fun')->setRequirement('_locale', 'en'));
240+
$this->routeCollection->add('fun.fr', (new Route('/amusant'))->setDefault('_locale', 'fr')->setDefault('_canonical_route', 'fun')->setRequirement('_locale', 'fr'));
241241

242242
file_put_contents($this->testTmpFilepath, $this->generatorDumper->dump());
243243

@@ -246,10 +246,10 @@ public function testDumpWithLocalizedRoutesPreserveTheGoodLocaleInTheUrl()
246246

247247
$compiledUrlGenerator = new CompiledUrlGenerator(require $this->testTmpFilepath, $requestContext, null, null);
248248

249-
$this->assertSame('/fr/foo', $compiledUrlGenerator->generate('foo'));
250-
$this->assertSame('/en/foo', $compiledUrlGenerator->generate('foo.en'));
251-
$this->assertSame('/en/foo', $compiledUrlGenerator->generate('foo', ['_locale' => 'en']));
252-
$this->assertSame('/en/foo', $compiledUrlGenerator->generate('foo.fr', ['_locale' => 'en']));
249+
$this->assertSame('/fr/fourchette', $compiledUrlGenerator->generate('foo'));
250+
$this->assertSame('/en/fork', $compiledUrlGenerator->generate('foo.en'));
251+
$this->assertSame('/en/fork', $compiledUrlGenerator->generate('foo', ['_locale' => 'en']));
252+
$this->assertSame('/fr/fourchette', $compiledUrlGenerator->generate('foo.fr', ['_locale' => 'en']));
253253

254254
$this->assertSame('/amusant', $compiledUrlGenerator->generate('fun'));
255255
$this->assertSame('/fun', $compiledUrlGenerator->generate('fun.en'));

Tests/Generator/UrlGeneratorTest.php

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ public function testGenerateWithDefaultLocale()
171171
foreach (['hr' => '/foo', 'en' => '/bar'] as $locale => $path) {
172172
$localizedRoute = clone $route;
173173
$localizedRoute->setDefault('_locale', $locale);
174+
$localizedRoute->setRequirement('_locale', $locale);
174175
$localizedRoute->setDefault('_canonical_route', $name);
175176
$localizedRoute->setPath($path);
176177
$routes->add($name.'.'.$locale, $localizedRoute);
@@ -195,6 +196,7 @@ public function testGenerateWithOverriddenParameterLocale()
195196
foreach (['hr' => '/foo', 'en' => '/bar'] as $locale => $path) {
196197
$localizedRoute = clone $route;
197198
$localizedRoute->setDefault('_locale', $locale);
199+
$localizedRoute->setRequirement('_locale', $locale);
198200
$localizedRoute->setDefault('_canonical_route', $name);
199201
$localizedRoute->setPath($path);
200202
$routes->add($name.'.'.$locale, $localizedRoute);
@@ -219,6 +221,7 @@ public function testGenerateWithOverriddenParameterLocaleFromRequestContext()
219221
foreach (['hr' => '/foo', 'en' => '/bar'] as $locale => $path) {
220222
$localizedRoute = clone $route;
221223
$localizedRoute->setDefault('_locale', $locale);
224+
$localizedRoute->setRequirement('_locale', $locale);
222225
$localizedRoute->setDefault('_canonical_route', $name);
223226
$localizedRoute->setPath($path);
224227
$routes->add($name.'.'.$locale, $localizedRoute);
@@ -240,18 +243,18 @@ public function testDumpWithLocalizedRoutesPreserveTheGoodLocaleInTheUrl()
240243
{
241244
$routeCollection = new RouteCollection();
242245

243-
$routeCollection->add('foo.en', (new Route('/{_locale}/foo'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'foo'));
244-
$routeCollection->add('foo.fr', (new Route('/{_locale}/foo'))->setDefault('_locale', 'fr')->setDefault('_canonical_route', 'foo'));
245-
$routeCollection->add('fun.en', (new Route('/fun'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'fun'));
246-
$routeCollection->add('fun.fr', (new Route('/amusant'))->setDefault('_locale', 'fr')->setDefault('_canonical_route', 'fun'));
246+
$routeCollection->add('foo.en', (new Route('/{_locale}/fork'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'foo')->setRequirement('_locale', 'en'));
247+
$routeCollection->add('foo.fr', (new Route('/{_locale}/fourchette'))->setDefault('_locale', 'fr')->setDefault('_canonical_route', 'foo')->setRequirement('_locale', 'fr'));
248+
$routeCollection->add('fun.en', (new Route('/fun'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'fun')->setRequirement('_locale', 'en'));
249+
$routeCollection->add('fun.fr', (new Route('/amusant'))->setDefault('_locale', 'fr')->setDefault('_canonical_route', 'fun')->setRequirement('_locale', 'fr'));
247250

248251
$urlGenerator = $this->getGenerator($routeCollection);
249252
$urlGenerator->getContext()->setParameter('_locale', 'fr');
250253

251-
$this->assertSame('/app.php/fr/foo', $urlGenerator->generate('foo'));
252-
$this->assertSame('/app.php/en/foo', $urlGenerator->generate('foo.en'));
253-
$this->assertSame('/app.php/en/foo', $urlGenerator->generate('foo', ['_locale' => 'en']));
254-
$this->assertSame('/app.php/en/foo', $urlGenerator->generate('foo.fr', ['_locale' => 'en']));
254+
$this->assertSame('/app.php/fr/fourchette', $urlGenerator->generate('foo'));
255+
$this->assertSame('/app.php/en/fork', $urlGenerator->generate('foo.en'));
256+
$this->assertSame('/app.php/en/fork', $urlGenerator->generate('foo', ['_locale' => 'en']));
257+
$this->assertSame('/app.php/fr/fourchette', $urlGenerator->generate('foo.fr', ['_locale' => 'en']));
255258

256259
$this->assertSame('/app.php/amusant', $urlGenerator->generate('fun'));
257260
$this->assertSame('/app.php/fun', $urlGenerator->generate('fun.en'));
@@ -278,6 +281,7 @@ public function testGenerateWithInvalidLocale()
278281
foreach (['hr' => '/foo', 'en' => '/bar'] as $locale => $path) {
279282
$localizedRoute = clone $route;
280283
$localizedRoute->setDefault('_locale', $locale);
284+
$localizedRoute->setRequirement('_locale', $locale);
281285
$localizedRoute->setDefault('_canonical_route', $name);
282286
$localizedRoute->setPath($path);
283287
$routes->add($name.'.'.$locale, $localizedRoute);

Tests/RouteTest.php

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,4 +270,65 @@ public function testSerializedRepresentationKeepsWorking()
270270
$this->assertEquals($route, $unserialized);
271271
$this->assertNotSame($route, $unserialized);
272272
}
273+
274+
/**
275+
* @dataProvider provideNonLocalizedRoutes
276+
*/
277+
public function testLocaleDefaultWithNonLocalizedRoutes(Route $route)
278+
{
279+
$this->assertNotSame('fr', $route->getDefault('_locale'));
280+
$route->setDefault('_locale', 'fr');
281+
$this->assertSame('fr', $route->getDefault('_locale'));
282+
}
283+
284+
/**
285+
* @dataProvider provideLocalizedRoutes
286+
*/
287+
public function testLocaleDefaultWithLocalizedRoutes(Route $route)
288+
{
289+
$expected = $route->getDefault('_locale');
290+
$this->assertIsString($expected);
291+
$this->assertNotSame('fr', $expected);
292+
$route->setDefault('_locale', 'fr');
293+
$this->assertSame($expected, $route->getDefault('_locale'));
294+
}
295+
296+
/**
297+
* @dataProvider provideNonLocalizedRoutes
298+
*/
299+
public function testLocaleRequirementWithNonLocalizedRoutes(Route $route)
300+
{
301+
$this->assertNotSame('fr', $route->getRequirement('_locale'));
302+
$route->setRequirement('_locale', 'fr');
303+
$this->assertSame('fr', $route->getRequirement('_locale'));
304+
}
305+
306+
/**
307+
* @dataProvider provideLocalizedRoutes
308+
*/
309+
public function testLocaleRequirementWithLocalizedRoutes(Route $route)
310+
{
311+
$expected = $route->getRequirement('_locale');
312+
$this->assertIsString($expected);
313+
$this->assertNotSame('fr', $expected);
314+
$route->setRequirement('_locale', 'fr');
315+
$this->assertSame($expected, $route->getRequirement('_locale'));
316+
}
317+
318+
public function provideNonLocalizedRoutes()
319+
{
320+
return [
321+
[(new Route('/foo'))],
322+
[(new Route('/foo'))->setDefault('_locale', 'en')],
323+
[(new Route('/foo'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'foo')],
324+
[(new Route('/foo'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'foo')->setRequirement('_locale', 'foobar')],
325+
];
326+
}
327+
328+
public function provideLocalizedRoutes()
329+
{
330+
return [
331+
[(new Route('/foo'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'foo')->setRequirement('_locale', 'en')],
332+
];
333+
}
273334
}

0 commit comments

Comments
 (0)