diff --git a/core/lib/Drupal/Core/Routing/RouteBuilder.php b/core/lib/Drupal/Core/Routing/RouteBuilder.php index e445c96..d353216 100644 --- a/core/lib/Drupal/Core/Routing/RouteBuilder.php +++ b/core/lib/Drupal/Core/Routing/RouteBuilder.php @@ -112,7 +112,9 @@ public function rebuild() { if (isset($routes['route_callbacks'])) { foreach ($routes['route_callbacks'] as $route_callback) { $controller = $this->controllerResolver->getControllerFromDefinition($route_callback); - $routes += call_user_func($controller); + if ($controller_routes = call_user_func($controller, $collection)) { + $routes += $controller_routes; + } } unset($routes['route_callbacks']); } diff --git a/core/modules/config_translation/config_translation.routing.yml b/core/modules/config_translation/config_translation.routing.yml index dd6b71f..4aea931 100644 --- a/core/modules/config_translation/config_translation.routing.yml +++ b/core/modules/config_translation/config_translation.routing.yml @@ -12,3 +12,6 @@ config_translation.entity_list: _content: '\Drupal\config_translation\Controller\ConfigTranslationListController::listing' requirements: _permission: 'translate configuration' + +route_callbacks: + - '\Drupal\config_translation\Routing\RouteSubscriber::routes' diff --git a/core/modules/config_translation/config_translation.services.yml b/core/modules/config_translation/config_translation.services.yml index f30e569..5f3e458 100644 --- a/core/modules/config_translation/config_translation.services.yml +++ b/core/modules/config_translation/config_translation.services.yml @@ -1,10 +1,4 @@ services: - config_translation.route_subscriber: - class: Drupal\config_translation\Routing\RouteSubscriber - arguments: ['@plugin.manager.config_translation.mapper'] - tags: - - { name: event_subscriber } - config_translation.access.overview: class: Drupal\config_translation\Access\ConfigTranslationOverviewAccess arguments: ['@plugin.manager.config_translation.mapper'] diff --git a/core/modules/config_translation/lib/Drupal/config_translation/Routing/RouteSubscriber.php b/core/modules/config_translation/lib/Drupal/config_translation/Routing/RouteSubscriber.php index 7f49d2c..7ab296f 100644 --- a/core/modules/config_translation/lib/Drupal/config_translation/Routing/RouteSubscriber.php +++ b/core/modules/config_translation/lib/Drupal/config_translation/Routing/RouteSubscriber.php @@ -7,14 +7,15 @@ namespace Drupal\config_translation\Routing; -use Drupal\Core\Routing\RouteSubscriberBase; +use Drupal\Core\DependencyInjection\ContainerInjectionInterface; use Drupal\config_translation\ConfigMapperManagerInterface; +use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\Routing\RouteCollection; /** * Listens to the dynamic route events. */ -class RouteSubscriber extends RouteSubscriberBase { +class RouteSubscriber implements ContainerInjectionInterface { /** * The mapper plugin discovery service. @@ -36,12 +37,17 @@ public function __construct(ConfigMapperManagerInterface $mapper_manager) { /** * {@inheritdoc} */ - protected function alterRoutes(RouteCollection $collection, $module) { - // @todo Consider converting this to a callback instead of an alter. - if ($module != 'dynamic_routes') { - return; - } + public static function create(ContainerInterface $container) { + return new static( + $container->get('plugin.manager.rest'), + $container->get('config.factory') + ); + } + /** + * {@inheritdoc} + */ + public function routes(RouteCollection $collection) { $mappers = $this->mapperManager->getMappers(); foreach ($mappers as $mapper) { $collection->add($mapper->getOverviewRouteName(), $mapper->getOverviewRoute()); diff --git a/core/modules/rest/lib/Drupal/rest/EventSubscriber/RouteSubscriber.php b/core/modules/rest/lib/Drupal/rest/EventSubscriber/RouteSubscriber.php index 9b8d68e..8493dc9 100644 --- a/core/modules/rest/lib/Drupal/rest/EventSubscriber/RouteSubscriber.php +++ b/core/modules/rest/lib/Drupal/rest/EventSubscriber/RouteSubscriber.php @@ -8,14 +8,15 @@ namespace Drupal\rest\EventSubscriber; use Drupal\Core\Config\ConfigFactory; -use Drupal\Core\Routing\RouteSubscriberBase; +use Drupal\Core\DependencyInjection\ContainerInjectionInterface; use Drupal\rest\Plugin\Type\ResourcePluginManager; +use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\Routing\RouteCollection; /** * Subscriber for REST-style routes. */ -class RouteSubscriber extends RouteSubscriberBase { +class RouteSubscriber implements ContainerInjectionInterface { /** * The plugin manager for REST plugins. @@ -47,12 +48,17 @@ public function __construct(ResourcePluginManager $manager, ConfigFactory $confi /** * {@inheritdoc} */ - protected function alterRoutes(RouteCollection $collection, $module) { - // @todo Consider converting this to a callback instead of an alter. - if ($module != 'dynamic_routes') { - return; - } + public static function create(ContainerInterface $container) { + return new static( + $container->get('plugin.manager.rest'), + $container->get('config.factory') + ); + } + /** + * {@inheritdoc} + */ + public function routes(RouteCollection $collection) { $enabled_resources = $this->config->get('rest.settings')->load()->get('resources'); // Iterate over all enabled resource plugins. diff --git a/core/modules/rest/rest.routing.yml b/core/modules/rest/rest.routing.yml index 843dee9..775fb54 100644 --- a/core/modules/rest/rest.routing.yml +++ b/core/modules/rest/rest.routing.yml @@ -4,3 +4,6 @@ rest.csrftoken: _controller: '\Drupal\rest\RequestHandler::csrfToken' requirements: _access: 'TRUE' + +route_callbacks: + - '\Drupal\rest\EventSubscriber\RouteSubscriber::routes' diff --git a/core/modules/rest/rest.services.yml b/core/modules/rest/rest.services.yml index d238442..7c63426 100644 --- a/core/modules/rest/rest.services.yml +++ b/core/modules/rest/rest.services.yml @@ -9,11 +9,6 @@ services: factory_method: get factory_service: cache_factory arguments: [rest] - rest.route_subscriber: - class: Drupal\rest\EventSubscriber\RouteSubscriber - tags: - - { name: event_subscriber } - arguments: ['@plugin.manager.rest', '@config.factory'] access_check.rest.csrf: class: Drupal\rest\Access\CSRFAccessCheck tags: diff --git a/core/tests/Drupal/Tests/Core/Routing/RouteBuilderTest.php b/core/tests/Drupal/Tests/Core/Routing/RouteBuilderTest.php index 790132f..7bde4b9 100644 --- a/core/tests/Drupal/Tests/Core/Routing/RouteBuilderTest.php +++ b/core/tests/Drupal/Tests/Core/Routing/RouteBuilderTest.php @@ -204,6 +204,7 @@ public function testRebuildWithProviderBasedRoutes() { 'test_module' => array( 'route_callbacks' => array( '\Drupal\Tests\Core\Routing\TestRouteSubscriber::routes', + '\Drupal\Tests\Core\Routing\TestRouteSubscriber::routesWithCollection', ), ), ))); @@ -218,6 +219,7 @@ public function testRebuildWithProviderBasedRoutes() { $route_collection_filled = new RouteCollection(); $route_collection_filled->add('test_route', new Route('/test-route')); + $route_collection_filled->add('test_route_collection', new Route('/test-route-collection')); // Ensure that the dispatch events for altering are fired. $this->dispatcher->expects($this->at(0)) @@ -273,4 +275,7 @@ public function routes() { ), ); } + public function routesWithCollection(RouteCollection $collection) { + $collection->add('test_route_collection', new Route('/test-route-collection')); + } }