From 096dc0aeefc3400669ebc34342278fd6ee47f256 Mon Sep 17 00:00:00 2001 From: Thomas Calvet Date: Mon, 2 Mar 2020 16:58:18 +0100 Subject: [PATCH] [Routing] Prevent localized routes _locale default & requirement from being overridden --- src/Symfony/Component/Routing/Route.php | 21 +++++++ .../Component/Routing/Tests/RouteTest.php | 61 +++++++++++++++++++ 2 files changed, 82 insertions(+) diff --git a/src/Symfony/Component/Routing/Route.php b/src/Symfony/Component/Routing/Route.php index 03ec76e0dde26..de98e1d76303d 100644 --- a/src/Symfony/Component/Routing/Route.php +++ b/src/Symfony/Component/Routing/Route.php @@ -376,6 +376,10 @@ public function setDefaults(array $defaults) */ public function addDefaults(array $defaults) { + if (isset($defaults['_locale']) && $this->isLocalized()) { + unset($defaults['_locale']); + } + foreach ($defaults as $name => $default) { $this->defaults[$name] = $default; } @@ -418,6 +422,10 @@ public function hasDefault($name) */ public function setDefault($name, $default) { + if ('_locale' === $name && $this->isLocalized()) { + return $this; + } + $this->defaults[$name] = $default; $this->compiled = null; @@ -461,6 +469,10 @@ public function setRequirements(array $requirements) */ public function addRequirements(array $requirements) { + if (isset($requirements['_locale']) && $this->isLocalized()) { + unset($requirements['_locale']); + } + foreach ($requirements as $key => $regex) { $this->requirements[$key] = $this->sanitizeRequirement($key, $regex); } @@ -503,6 +515,10 @@ public function hasRequirement($key) */ public function setRequirement($key, $regex) { + if ('_locale' === $key && $this->isLocalized()) { + return $this; + } + $this->requirements[$key] = $this->sanitizeRequirement($key, $regex); $this->compiled = null; @@ -577,4 +593,9 @@ private function sanitizeRequirement(string $key, $regex) return $regex; } + + private function isLocalized(): bool + { + return isset($this->defaults['_locale']) && isset($this->defaults['_canonical_route']) && ($this->requirements['_locale'] ?? null) === preg_quote($this->defaults['_locale'], RouteCompiler::REGEX_DELIMITER); + } } diff --git a/src/Symfony/Component/Routing/Tests/RouteTest.php b/src/Symfony/Component/Routing/Tests/RouteTest.php index 6add1337ed369..4c767f9d95c83 100644 --- a/src/Symfony/Component/Routing/Tests/RouteTest.php +++ b/src/Symfony/Component/Routing/Tests/RouteTest.php @@ -271,4 +271,65 @@ public function testSerializedRepresentationKeepsWorking() $this->assertEquals($route, $unserialized); $this->assertNotSame($route, $unserialized); } + + /** + * @dataProvider provideNonLocalizedRoutes + */ + public function testLocaleDefaultWithNonLocalizedRoutes(Route $route) + { + $this->assertNotSame('fr', $route->getDefault('_locale')); + $route->setDefault('_locale', 'fr'); + $this->assertSame('fr', $route->getDefault('_locale')); + } + + /** + * @dataProvider provideLocalizedRoutes + */ + public function testLocaleDefaultWithLocalizedRoutes(Route $route) + { + $expected = $route->getDefault('_locale'); + $this->assertIsString($expected); + $this->assertNotSame('fr', $expected); + $route->setDefault('_locale', 'fr'); + $this->assertSame($expected, $route->getDefault('_locale')); + } + + /** + * @dataProvider provideNonLocalizedRoutes + */ + public function testLocaleRequirementWithNonLocalizedRoutes(Route $route) + { + $this->assertNotSame('fr', $route->getRequirement('_locale')); + $route->setRequirement('_locale', 'fr'); + $this->assertSame('fr', $route->getRequirement('_locale')); + } + + /** + * @dataProvider provideLocalizedRoutes + */ + public function testLocaleRequirementWithLocalizedRoutes(Route $route) + { + $expected = $route->getRequirement('_locale'); + $this->assertIsString($expected); + $this->assertNotSame('fr', $expected); + $route->setRequirement('_locale', 'fr'); + $this->assertSame($expected, $route->getRequirement('_locale')); + } + + public function provideNonLocalizedRoutes() + { + return [ + [(new Route('/foo'))], + [(new Route('/foo'))->setDefault('_locale', 'en')], + [(new Route('/foo'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'foo')], + [(new Route('/foo'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'foo')->setRequirement('_locale', 'foobar')], + ]; + } + + public function provideLocalizedRoutes() + { + return [ + [(new Route('/foo'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'foo')->setRequirement('_locale', 'en')], + ]; + } } pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy