From ecbaff0138f88f7e30d42a8a1b9cbd696f519d74 Mon Sep 17 00:00:00 2001 From: matlec Date: Wed, 8 Jan 2025 09:44:49 +0100 Subject: [PATCH] =?UTF-8?q?[Routing]=20Fix=20configuring=20a=20single=20ro?= =?UTF-8?q?ute=E2=80=99=20hosts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Loader/Configurator/RouteConfigurator.php | 7 ++++++ .../Routing/Loader/XmlFileLoader.php | 4 +++- .../Routing/Loader/YamlFileLoader.php | 4 +++- .../route-with-hosts-expected-collection.php | 23 +++++++++++++++++++ .../locale_and_host/route-with-hosts.php | 10 ++++++++ .../locale_and_host/route-with-hosts.xml | 10 ++++++++ .../locale_and_host/route-with-hosts.yml | 6 +++++ .../Tests/Loader/PhpFileLoaderTest.php | 10 ++++++++ .../Tests/Loader/XmlFileLoaderTest.php | 10 ++++++++ .../Tests/Loader/YamlFileLoaderTest.php | 10 ++++++++ 10 files changed, 92 insertions(+), 2 deletions(-) create mode 100644 src/Symfony/Component/Routing/Tests/Fixtures/locale_and_host/route-with-hosts-expected-collection.php create mode 100644 src/Symfony/Component/Routing/Tests/Fixtures/locale_and_host/route-with-hosts.php create mode 100644 src/Symfony/Component/Routing/Tests/Fixtures/locale_and_host/route-with-hosts.xml create mode 100644 src/Symfony/Component/Routing/Tests/Fixtures/locale_and_host/route-with-hosts.yml diff --git a/src/Symfony/Component/Routing/Loader/Configurator/RouteConfigurator.php b/src/Symfony/Component/Routing/Loader/Configurator/RouteConfigurator.php index d9d441da19a37..26a2e3857e09e 100644 --- a/src/Symfony/Component/Routing/Loader/Configurator/RouteConfigurator.php +++ b/src/Symfony/Component/Routing/Loader/Configurator/RouteConfigurator.php @@ -42,7 +42,14 @@ public function __construct(RouteCollection $collection, RouteCollection $route, */ final public function host(string|array $host): static { + $previousRoutes = clone $this->route; $this->addHost($this->route, $host); + foreach ($previousRoutes as $name => $route) { + if (!$this->route->get($name)) { + $this->collection->remove($name); + } + } + $this->collection->addCollection($this->route); return $this; } diff --git a/src/Symfony/Component/Routing/Loader/XmlFileLoader.php b/src/Symfony/Component/Routing/Loader/XmlFileLoader.php index 2518161ae0c9b..1e3e3283dcab0 100644 --- a/src/Symfony/Component/Routing/Loader/XmlFileLoader.php +++ b/src/Symfony/Component/Routing/Loader/XmlFileLoader.php @@ -135,7 +135,7 @@ protected function parseRoute(RouteCollection $collection, \DOMElement $node, st throw new \InvalidArgumentException(sprintf('The element in file "%s" must not have both a "path" attribute and child nodes.', $path)); } - $routes = $this->createLocalizedRoute($collection, $id, $paths ?: $node->getAttribute('path')); + $routes = $this->createLocalizedRoute(new RouteCollection(), $id, $paths ?: $node->getAttribute('path')); $routes->addDefaults($defaults); $routes->addRequirements($requirements); $routes->addOptions($options); @@ -146,6 +146,8 @@ protected function parseRoute(RouteCollection $collection, \DOMElement $node, st if (null !== $hosts) { $this->addHost($routes, $hosts); } + + $collection->addCollection($routes); } /** diff --git a/src/Symfony/Component/Routing/Loader/YamlFileLoader.php b/src/Symfony/Component/Routing/Loader/YamlFileLoader.php index 9605e9a8772e0..09beb7cd54739 100644 --- a/src/Symfony/Component/Routing/Loader/YamlFileLoader.php +++ b/src/Symfony/Component/Routing/Loader/YamlFileLoader.php @@ -157,7 +157,7 @@ protected function parseRoute(RouteCollection $collection, string $name, array $ $defaults['_stateless'] = $config['stateless']; } - $routes = $this->createLocalizedRoute($collection, $name, $config['path']); + $routes = $this->createLocalizedRoute(new RouteCollection(), $name, $config['path']); $routes->addDefaults($defaults); $routes->addRequirements($requirements); $routes->addOptions($options); @@ -168,6 +168,8 @@ protected function parseRoute(RouteCollection $collection, string $name, array $ if (isset($config['host'])) { $this->addHost($routes, $config['host']); } + + $collection->addCollection($routes); } /** diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/locale_and_host/route-with-hosts-expected-collection.php b/src/Symfony/Component/Routing/Tests/Fixtures/locale_and_host/route-with-hosts-expected-collection.php new file mode 100644 index 0000000000000..afff1f0bcdcfe --- /dev/null +++ b/src/Symfony/Component/Routing/Tests/Fixtures/locale_and_host/route-with-hosts-expected-collection.php @@ -0,0 +1,23 @@ +add('static.en', $route = new Route('/example')); + $route->setHost('www.example.com'); + $route->setRequirement('_locale', 'en'); + $route->setDefault('_locale', 'en'); + $route->setDefault('_canonical_route', 'static'); + $expectedRoutes->add('static.nl', $route = new Route('/example')); + $route->setHost('www.example.nl'); + $route->setRequirement('_locale', 'nl'); + $route->setDefault('_locale', 'nl'); + $route->setDefault('_canonical_route', 'static'); + + $expectedRoutes->addResource(new FileResource(__DIR__."/route-with-hosts.$format")); + + return $expectedRoutes; +}; diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/locale_and_host/route-with-hosts.php b/src/Symfony/Component/Routing/Tests/Fixtures/locale_and_host/route-with-hosts.php new file mode 100644 index 0000000000000..44472d77ae171 --- /dev/null +++ b/src/Symfony/Component/Routing/Tests/Fixtures/locale_and_host/route-with-hosts.php @@ -0,0 +1,10 @@ +add('static', '/example')->host([ + 'nl' => 'www.example.nl', + 'en' => 'www.example.com', + ]); +}; diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/locale_and_host/route-with-hosts.xml b/src/Symfony/Component/Routing/Tests/Fixtures/locale_and_host/route-with-hosts.xml new file mode 100644 index 0000000000000..f4b16e4d80700 --- /dev/null +++ b/src/Symfony/Component/Routing/Tests/Fixtures/locale_and_host/route-with-hosts.xml @@ -0,0 +1,10 @@ + + + + www.example.nl + www.example.com + + diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/locale_and_host/route-with-hosts.yml b/src/Symfony/Component/Routing/Tests/Fixtures/locale_and_host/route-with-hosts.yml new file mode 100644 index 0000000000000..c340f71ff016d --- /dev/null +++ b/src/Symfony/Component/Routing/Tests/Fixtures/locale_and_host/route-with-hosts.yml @@ -0,0 +1,6 @@ +--- +static: + path: /example + host: + nl: www.example.nl + en: www.example.com diff --git a/src/Symfony/Component/Routing/Tests/Loader/PhpFileLoaderTest.php b/src/Symfony/Component/Routing/Tests/Loader/PhpFileLoaderTest.php index dbe45bcf82ec2..2ec8bd04ddacc 100644 --- a/src/Symfony/Component/Routing/Tests/Loader/PhpFileLoaderTest.php +++ b/src/Symfony/Component/Routing/Tests/Loader/PhpFileLoaderTest.php @@ -317,6 +317,16 @@ public function testImportingRoutesWithSingleHostInImporter() $this->assertEquals($expectedRoutes('php'), $routes); } + public function testAddingRouteWithHosts() + { + $loader = new PhpFileLoader(new FileLocator([__DIR__.'/../Fixtures/locale_and_host'])); + $routes = $loader->load('route-with-hosts.php'); + + $expectedRoutes = require __DIR__.'/../Fixtures/locale_and_host/route-with-hosts-expected-collection.php'; + + $this->assertEquals($expectedRoutes('php'), $routes); + } + public function testImportingAliases() { $loader = new PhpFileLoader(new FileLocator([__DIR__.'/../Fixtures/alias'])); diff --git a/src/Symfony/Component/Routing/Tests/Loader/XmlFileLoaderTest.php b/src/Symfony/Component/Routing/Tests/Loader/XmlFileLoaderTest.php index 9e42db7a7e6fe..83859120e31f8 100644 --- a/src/Symfony/Component/Routing/Tests/Loader/XmlFileLoaderTest.php +++ b/src/Symfony/Component/Routing/Tests/Loader/XmlFileLoaderTest.php @@ -577,6 +577,16 @@ public function testImportingRoutesWithSingleHostsInImporter() $this->assertEquals($expectedRoutes('xml'), $routes); } + public function testAddingRouteWithHosts() + { + $loader = new XmlFileLoader(new FileLocator([__DIR__.'/../Fixtures/locale_and_host'])); + $routes = $loader->load('route-with-hosts.xml'); + + $expectedRoutes = require __DIR__.'/../Fixtures/locale_and_host/route-with-hosts-expected-collection.php'; + + $this->assertEquals($expectedRoutes('xml'), $routes); + } + public function testWhenEnv() { $loader = new XmlFileLoader(new FileLocator([__DIR__.'/../Fixtures']), 'some-env'); diff --git a/src/Symfony/Component/Routing/Tests/Loader/YamlFileLoaderTest.php b/src/Symfony/Component/Routing/Tests/Loader/YamlFileLoaderTest.php index 6573fd0138ac8..1e34386818e6b 100644 --- a/src/Symfony/Component/Routing/Tests/Loader/YamlFileLoaderTest.php +++ b/src/Symfony/Component/Routing/Tests/Loader/YamlFileLoaderTest.php @@ -443,6 +443,16 @@ public function testImportingRoutesWithSingleHostInImporter() $this->assertEquals($expectedRoutes('yml'), $routes); } + public function testAddingRouteWithHosts() + { + $loader = new YamlFileLoader(new FileLocator([__DIR__.'/../Fixtures/locale_and_host'])); + $routes = $loader->load('route-with-hosts.yml'); + + $expectedRoutes = require __DIR__.'/../Fixtures/locale_and_host/route-with-hosts-expected-collection.php'; + + $this->assertEquals($expectedRoutes('yml'), $routes); + } + public function testWhenEnv() { $loader = new YamlFileLoader(new FileLocator([__DIR__.'/../Fixtures']), 'some-env');