From 8f457e0a634bdb8a54c87f6f3c7cbae058c9075b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Thu, 22 Jan 2015 17:05:21 +0100 Subject: [PATCH] loads route automatically route must now be indicated in config.yml under chill_main.routing.resources. Other bundle may add routes prepending configuration --- DependencyInjection/ChillMainExtension.php | 13 ++++ DependencyInjection/Configuration.php | 6 ++ Resources/config/services.yml | 7 ++ Routing/Loader/ChillRoutesLoader.php | 79 ++++++++++++++++++++++ Tests/Routing/Loader/RouteLoaderTest.php | 52 ++++++++++++++ 5 files changed, 157 insertions(+) create mode 100644 Routing/Loader/ChillRoutesLoader.php create mode 100644 Tests/Routing/Loader/RouteLoaderTest.php diff --git a/DependencyInjection/ChillMainExtension.php b/DependencyInjection/ChillMainExtension.php index 2ee498070..76c96f8aa 100644 --- a/DependencyInjection/ChillMainExtension.php +++ b/DependencyInjection/ChillMainExtension.php @@ -28,6 +28,9 @@ class ChillMainExtension extends Extension implements PrependExtensionInterface $container->setParameter('chill_main.available_languages', $config['available_languages']); + + $container->setParameter('chill_main.routing.resources', + $config['routing']['resources']); $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); $loader->load('services.yml'); @@ -71,5 +74,15 @@ class ChillMainExtension extends Extension implements PrependExtensionInterface ) ) )); + + //add current route to chill main + $container->prependExtensionConfig('chill_main', array( + 'routing' => array( + 'resources' => array( + '@ChillMainBundle/Resources/config/routing.yml' + ) + + ) + )); } } diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php index 5290d12f3..27d6a842f 100644 --- a/DependencyInjection/Configuration.php +++ b/DependencyInjection/Configuration.php @@ -30,6 +30,12 @@ class Configuration implements ConfigurationInterface ->defaultValue(array('fr')) ->prototype('scalar')->end() ->end() + ->arrayNode('routing') + ->children() + ->arrayNode('resources') + ->prototype('scalar')->end() + ->end() + ->end() ->end(); return $treeBuilder; diff --git a/Resources/config/services.yml b/Resources/config/services.yml index ec8434a8b..fbee3d60a 100644 --- a/Resources/config/services.yml +++ b/Resources/config/services.yml @@ -2,6 +2,13 @@ parameters: # cl_chill_main.example.class: Chill\MainBundle\Example services: + chill.main.routes_loader: + class: Chill\MainBundle\Routing\Loader\ChillRoutesLoader + arguments: + - "%chill_main.routing.resources%" + tags: + - { name: routing.loader } + chill.main.menu_composer: class: Chill\MainBundle\Routing\MenuComposer #must be set in function to avoid circular reference with chill.main.twig.chill_menu diff --git a/Routing/Loader/ChillRoutesLoader.php b/Routing/Loader/ChillRoutesLoader.php new file mode 100644 index 000000000..791f32150 --- /dev/null +++ b/Routing/Loader/ChillRoutesLoader.php @@ -0,0 +1,79 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +namespace Chill\MainBundle\Routing\Loader; + +use Symfony\Component\Config\Loader\Loader; +use Symfony\Component\Routing\RouteCollection; + +/** + * Import routes from bundles + * + * Routes must be defined in configuration, add an entry + * under `chill_main.routing.resources` + * + * + * + * @author Julien Fastré + */ +class ChillRoutesLoader extends Loader +{ + private $routes; + + + + public function __construct(array $routes) + { + $this->routes = $routes; + } + + /** + * {@inheritDoc} + * + * @param type $resource + * @param type $type + * @return RouteCollection + */ + public function load($resource, $type = null) + { + $collection = new RouteCollection(); + + foreach ($this->routes as $resource) { + $collection->addCollection( + $this->import($resource, NULL) + ); + } + + return $collection; + } + + /** + * {@inheritDoc} + * + * @param type $resource + * @param type $type + * @return boolean + */ + public function supports($resource, $type = null) + { + return 'chill_routes' === $type; + } + +} diff --git a/Tests/Routing/Loader/RouteLoaderTest.php b/Tests/Routing/Loader/RouteLoaderTest.php new file mode 100644 index 000000000..81dc4d151 --- /dev/null +++ b/Tests/Routing/Loader/RouteLoaderTest.php @@ -0,0 +1,52 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +namespace Chill\MainBundle\Tests\Routing\Loader; + +use Chill\MainBundle\Routing\Loader\ChillRoutesLoader; +use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; + + +/** + * Test the route loader + * + * @author Julien Fastré + */ +class RouteLoaderTest extends KernelTestCase +{ + private $router; + + public function setUp() + { + static::bootKernel(); + $this->router = static::$kernel->getContainer()->get('router'); + } + + /** + * Test that the route loader loads at least homepage + */ + public function testRouteFromMainBundleAreLoaded() + { + $homepage = $this->router->getRouteCollection()->get('chill_main_homepage'); + + $this->assertNotNull($homepage); + } + +}