diff --git a/src/Symfony/Component/Routing/Loader/Configurator/RoutingConfigurator.php b/src/Symfony/Component/Routing/Loader/Configurator/RoutingConfigurator.php index 4591a86ba5cf9..d992cef843975 100644 --- a/src/Symfony/Component/Routing/Loader/Configurator/RoutingConfigurator.php +++ b/src/Symfony/Component/Routing/Loader/Configurator/RoutingConfigurator.php @@ -39,9 +39,17 @@ public function __construct(RouteCollection $collection, PhpFileLoader $loader, final public function import($resource, $type = null, $ignoreErrors = false) { $this->loader->setCurrentDir(dirname($this->path)); - $subCollection = $this->loader->import($resource, $type, $ignoreErrors, $this->file); + $imported = $this->loader->import($resource, $type, $ignoreErrors, $this->file); + if (!is_array($imported)) { + return new ImportConfigurator($this->collection, $imported); + } - return new ImportConfigurator($this->collection, $subCollection); + $mergedCollection = new RouteCollection(); + foreach ($imported as $subCollection) { + $mergedCollection->addCollection($subCollection); + } + + return new ImportConfigurator($this->collection, $mergedCollection); } /** diff --git a/src/Symfony/Component/Routing/Loader/XmlFileLoader.php b/src/Symfony/Component/Routing/Loader/XmlFileLoader.php index 3a77890703ce2..f3f66055e675a 100644 --- a/src/Symfony/Component/Routing/Loader/XmlFileLoader.php +++ b/src/Symfony/Component/Routing/Loader/XmlFileLoader.php @@ -146,26 +146,33 @@ protected function parseImport(RouteCollection $collection, \DOMElement $node, $ $this->setCurrentDir(dirname($path)); - $subCollection = $this->import($resource, ('' !== $type ? $type : null), false, $file); - /* @var $subCollection RouteCollection */ - $subCollection->addPrefix($prefix); - if (null !== $host) { - $subCollection->setHost($host); - } - if (null !== $condition) { - $subCollection->setCondition($condition); - } - if (null !== $schemes) { - $subCollection->setSchemes($schemes); - } - if (null !== $methods) { - $subCollection->setMethods($methods); + $imported = $this->import($resource, ('' !== $type ? $type : null), false, $file); + + if (!is_array($imported)) { + $imported = array($imported); } - $subCollection->addDefaults($defaults); - $subCollection->addRequirements($requirements); - $subCollection->addOptions($options); - $collection->addCollection($subCollection); + foreach ($imported as $subCollection) { + /* @var $subCollection RouteCollection */ + $subCollection->addPrefix($prefix); + if (null !== $host) { + $subCollection->setHost($host); + } + if (null !== $condition) { + $subCollection->setCondition($condition); + } + if (null !== $schemes) { + $subCollection->setSchemes($schemes); + } + if (null !== $methods) { + $subCollection->setMethods($methods); + } + $subCollection->addDefaults($defaults); + $subCollection->addRequirements($requirements); + $subCollection->addOptions($options); + + $collection->addCollection($subCollection); + } } /** diff --git a/src/Symfony/Component/Routing/Loader/YamlFileLoader.php b/src/Symfony/Component/Routing/Loader/YamlFileLoader.php index 037d581d05eab..f59f9097f6c6d 100644 --- a/src/Symfony/Component/Routing/Loader/YamlFileLoader.php +++ b/src/Symfony/Component/Routing/Loader/YamlFileLoader.php @@ -158,26 +158,33 @@ protected function parseImport(RouteCollection $collection, array $config, $path $this->setCurrentDir(dirname($path)); - $subCollection = $this->import($config['resource'], $type, false, $file); - /* @var $subCollection RouteCollection */ - $subCollection->addPrefix($prefix); - if (null !== $host) { - $subCollection->setHost($host); - } - if (null !== $condition) { - $subCollection->setCondition($condition); - } - if (null !== $schemes) { - $subCollection->setSchemes($schemes); - } - if (null !== $methods) { - $subCollection->setMethods($methods); + $imported = $this->import($config['resource'], $type, false, $file); + + if (!is_array($imported)) { + $imported = array($imported); } - $subCollection->addDefaults($defaults); - $subCollection->addRequirements($requirements); - $subCollection->addOptions($options); - $collection->addCollection($subCollection); + foreach ($imported as $subCollection) { + /* @var $subCollection RouteCollection */ + $subCollection->addPrefix($prefix); + if (null !== $host) { + $subCollection->setHost($host); + } + if (null !== $condition) { + $subCollection->setCondition($condition); + } + if (null !== $schemes) { + $subCollection->setSchemes($schemes); + } + if (null !== $methods) { + $subCollection->setMethods($methods); + } + $subCollection->addDefaults($defaults); + $subCollection->addRequirements($requirements); + $subCollection->addOptions($options); + + $collection->addCollection($subCollection); + } } /** diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/glob/bar.xml b/src/Symfony/Component/Routing/Tests/Fixtures/glob/bar.xml new file mode 100644 index 0000000000000..0d31eeb178fc9 --- /dev/null +++ b/src/Symfony/Component/Routing/Tests/Fixtures/glob/bar.xml @@ -0,0 +1,8 @@ + + + + + diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/glob/bar.yml b/src/Symfony/Component/Routing/Tests/Fixtures/glob/bar.yml new file mode 100644 index 0000000000000..ba3bc2294b340 --- /dev/null +++ b/src/Symfony/Component/Routing/Tests/Fixtures/glob/bar.yml @@ -0,0 +1,4 @@ +bar_route: + path: /bar + defaults: + _controller: AppBundle:Bar:view diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/glob/baz.xml b/src/Symfony/Component/Routing/Tests/Fixtures/glob/baz.xml new file mode 100644 index 0000000000000..3abba1acede10 --- /dev/null +++ b/src/Symfony/Component/Routing/Tests/Fixtures/glob/baz.xml @@ -0,0 +1,8 @@ + + + + + diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/glob/baz.yml b/src/Symfony/Component/Routing/Tests/Fixtures/glob/baz.yml new file mode 100644 index 0000000000000..f7d8c67f266a8 --- /dev/null +++ b/src/Symfony/Component/Routing/Tests/Fixtures/glob/baz.yml @@ -0,0 +1,4 @@ +baz_route: + path: /baz + defaults: + _controller: AppBundle:Baz:view diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/glob/import_multiple.xml b/src/Symfony/Component/Routing/Tests/Fixtures/glob/import_multiple.xml new file mode 100644 index 0000000000000..ca6b1b5a927bb --- /dev/null +++ b/src/Symfony/Component/Routing/Tests/Fixtures/glob/import_multiple.xml @@ -0,0 +1,8 @@ + + + + + diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/glob/import_multiple.yml b/src/Symfony/Component/Routing/Tests/Fixtures/glob/import_multiple.yml new file mode 100644 index 0000000000000..d1ae5854a51c1 --- /dev/null +++ b/src/Symfony/Component/Routing/Tests/Fixtures/glob/import_multiple.yml @@ -0,0 +1,2 @@ +_static: + resource: ba?.yml diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/glob/import_single.xml b/src/Symfony/Component/Routing/Tests/Fixtures/glob/import_single.xml new file mode 100644 index 0000000000000..15f5698ccd712 --- /dev/null +++ b/src/Symfony/Component/Routing/Tests/Fixtures/glob/import_single.xml @@ -0,0 +1,8 @@ + + + + + diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/glob/import_single.yml b/src/Symfony/Component/Routing/Tests/Fixtures/glob/import_single.yml new file mode 100644 index 0000000000000..f56ddbd0be9f7 --- /dev/null +++ b/src/Symfony/Component/Routing/Tests/Fixtures/glob/import_single.yml @@ -0,0 +1,2 @@ +_static: + resource: b?r.yml diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/glob/php_dsl.php b/src/Symfony/Component/Routing/Tests/Fixtures/glob/php_dsl.php new file mode 100644 index 0000000000000..897fa11f282af --- /dev/null +++ b/src/Symfony/Component/Routing/Tests/Fixtures/glob/php_dsl.php @@ -0,0 +1,7 @@ +import('php_dsl_ba?.php'); +}; diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/glob/php_dsl_bar.php b/src/Symfony/Component/Routing/Tests/Fixtures/glob/php_dsl_bar.php new file mode 100644 index 0000000000000..e2b91b17da490 --- /dev/null +++ b/src/Symfony/Component/Routing/Tests/Fixtures/glob/php_dsl_bar.php @@ -0,0 +1,12 @@ +collection(); + + $collection->add('bar_route', '/bar') + ->defaults(array('_controller' => 'AppBundle:Bar:view')); + + return $collection; +}; diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/glob/php_dsl_baz.php b/src/Symfony/Component/Routing/Tests/Fixtures/glob/php_dsl_baz.php new file mode 100644 index 0000000000000..ca8f188a7633e --- /dev/null +++ b/src/Symfony/Component/Routing/Tests/Fixtures/glob/php_dsl_baz.php @@ -0,0 +1,12 @@ +collection(); + + $collection->add('baz_route', '/baz') + ->defaults(array('_controller' => 'AppBundle:Baz:view')); + + return $collection; +}; diff --git a/src/Symfony/Component/Routing/Tests/Loader/PhpFileLoaderTest.php b/src/Symfony/Component/Routing/Tests/Loader/PhpFileLoaderTest.php index 608d84ed7a20f..0dcf5d4941bef 100644 --- a/src/Symfony/Component/Routing/Tests/Loader/PhpFileLoaderTest.php +++ b/src/Symfony/Component/Routing/Tests/Loader/PhpFileLoaderTest.php @@ -117,4 +117,17 @@ public function testRoutingConfigurator() $this->assertEquals($expectedCollection, $routeCollection); } + + public function testRoutingConfiguratorCanImportGlobPatterns() + { + $locator = new FileLocator(array(__DIR__.'/../Fixtures/glob')); + $loader = new PhpFileLoader($locator); + $routeCollection = $loader->load('php_dsl.php'); + + $route = $routeCollection->get('bar_route'); + $this->assertSame('AppBundle:Bar:view', $route->getDefault('_controller')); + + $route = $routeCollection->get('baz_route'); + $this->assertSame('AppBundle:Baz:view', $route->getDefault('_controller')); + } } diff --git a/src/Symfony/Component/Routing/Tests/Loader/XmlFileLoaderTest.php b/src/Symfony/Component/Routing/Tests/Loader/XmlFileLoaderTest.php index 221434b0068aa..21fc3400f249e 100644 --- a/src/Symfony/Component/Routing/Tests/Loader/XmlFileLoaderTest.php +++ b/src/Symfony/Component/Routing/Tests/Loader/XmlFileLoaderTest.php @@ -361,4 +361,25 @@ public function testImportWithOverriddenController() $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures/controller'))); $loader->load('import_override_defaults.xml'); } + + public function testImportRouteWithGlobMatchingSingleFile() + { + $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures/glob'))); + $routeCollection = $loader->load('import_single.xml'); + + $route = $routeCollection->get('bar_route'); + $this->assertSame('AppBundle:Bar:view', $route->getDefault('_controller')); + } + + public function testImportRouteWithGlobMatchingMultipleFiles() + { + $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures/glob'))); + $routeCollection = $loader->load('import_multiple.xml'); + + $route = $routeCollection->get('bar_route'); + $this->assertSame('AppBundle:Bar:view', $route->getDefault('_controller')); + + $route = $routeCollection->get('baz_route'); + $this->assertSame('AppBundle:Baz:view', $route->getDefault('_controller')); + } } diff --git a/src/Symfony/Component/Routing/Tests/Loader/YamlFileLoaderTest.php b/src/Symfony/Component/Routing/Tests/Loader/YamlFileLoaderTest.php index 1f7fd43897ae3..822bddf1f0c34 100644 --- a/src/Symfony/Component/Routing/Tests/Loader/YamlFileLoaderTest.php +++ b/src/Symfony/Component/Routing/Tests/Loader/YamlFileLoaderTest.php @@ -182,4 +182,25 @@ public function testImportWithOverriddenController() $loader = new YamlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures/controller'))); $loader->load('import_override_defaults.yml'); } + + public function testImportRouteWithGlobMatchingSingleFile() + { + $loader = new YamlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures/glob'))); + $routeCollection = $loader->load('import_single.yml'); + + $route = $routeCollection->get('bar_route'); + $this->assertSame('AppBundle:Bar:view', $route->getDefault('_controller')); + } + + public function testImportRouteWithGlobMatchingMultipleFiles() + { + $loader = new YamlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures/glob'))); + $routeCollection = $loader->load('import_multiple.yml'); + + $route = $routeCollection->get('bar_route'); + $this->assertSame('AppBundle:Bar:view', $route->getDefault('_controller')); + + $route = $routeCollection->get('baz_route'); + $this->assertSame('AppBundle:Baz:view', $route->getDefault('_controller')); + } }