diff --git a/core/lib/Drupal/Core/Routing/RouteBuilder.php b/core/lib/Drupal/Core/Routing/RouteBuilder.php index 0581ebc..d720f07 100644 --- a/core/lib/Drupal/Core/Routing/RouteBuilder.php +++ b/core/lib/Drupal/Core/Routing/RouteBuilder.php @@ -109,6 +109,12 @@ public function rebuild() { foreach ($yaml_discovery->findAll() as $provider => $routes) { $collection = new RouteCollection(); + // The top-level 'routes_callback' is a list of methods in controller + // syntax, see \Drupal\Core\Controller\ControllerResolver. These methods + // should return a set of \Symfony\Component\Routing\Route objects, either + // in an associative array keyed by the route name, or as a new + // \Symfony\Component\Routing\RouteCollection, which will be iterated over + // and added to the collection for this provider. if (isset($routes['route_callbacks'])) { foreach ($routes['route_callbacks'] as $route_callback) { $callback = $this->controllerResolver->getControllerFromDefinition($route_callback); diff --git a/core/tests/Drupal/Tests/Core/Routing/RouteBuilderTest.php b/core/tests/Drupal/Tests/Core/Routing/RouteBuilderTest.php index 9ea2165..98cbfda 100644 --- a/core/tests/Drupal/Tests/Core/Routing/RouteBuilderTest.php +++ b/core/tests/Drupal/Tests/Core/Routing/RouteBuilderTest.php @@ -8,10 +8,10 @@ namespace Drupal\Tests\Core\Routing; use Drupal\Component\Discovery\YamlDiscovery; +use Drupal\Core\DependencyInjection\ContainerBuilder; use Drupal\Core\Routing\RouteBuilder; use Drupal\Core\Routing\RouteBuildEvent; use Drupal\Core\Routing\RoutingEvents; -use Drupal\Tests\Core\Routing\RoutingFixtures; use Drupal\Tests\UnitTestCase; use Symfony\Component\Routing\Route; use Symfony\Component\Routing\RouteCollection; @@ -203,21 +203,32 @@ public function testRebuildWithProviderBasedRoutes() { ->will($this->returnValue(array( 'test_module' => array( 'route_callbacks' => array( - '\Drupal\Tests\Core\Routing\TestRouteSubscriber::routes', + '\Drupal\Tests\Core\Routing\TestRouteSubscriber::routesFromArray', + 'test_module.route_service:routesFromCollection', ), ), ))); + $container = new ContainerBuilder(); + $container->set('test_module.route_service', new TestRouteSubscriber()); $this->controllerResolver->expects($this->any()) ->method('getControllerFromDefinition') - ->will($this->returnCallback(function ($controller) { - list($class, $method) = explode('::', $controller, 2); - $controller = new $class(); - return array($controller, $method); + ->will($this->returnCallback(function ($controller) use ($container) { + $count = substr_count($controller, ':'); + if ($count == 1) { + list($service, $method) = explode(':', $controller, 2); + $object = $container->get($service); + } + else { + list($class, $method) = explode('::', $controller, 2); + $object = new $class(); + } + return array($object, $method); })); $route_collection_filled = new RouteCollection(); - $route_collection_filled->add('test_route', new Route('/test-route')); + $route_collection_filled->add('test_route.1', new Route('/test-route/1')); + $route_collection_filled->add('test_route.2', new Route('/test-route/2')); // Ensure that the dispatch events for altering are fired. $this->dispatcher->expects($this->at(0)) @@ -266,9 +277,14 @@ public function setYamlDiscovery(YamlDiscovery $yaml_discovery) { * Provides a callback for route definition. */ class TestRouteSubscriber { - public function routes() { + public function routesFromArray() { return array( - 'test_route' => new Route('/test-route'), + 'test_route.1' => new Route('/test-route/1'), ); } + public function routesFromCollection() { + $collection = new RouteCollection(); + $collection->add('test_route.2', new Route('/test-route/2')); + return $collection; + } }