Route page requests to code based on URLs.
The Drupal routing system defines how Drupal responds to URL requests that the web server passes on to Drupal. The routing system is based on the Symfony framework. The central idea is that Drupal subsystems and modules can register routes (basically, URL paths and context); they can also register to respond dynamically to routes, for more flexibility. When Drupal receives a URL request, it will attempt to match the request to a registered route, and query dynamic responders. If a match is made, Drupal will then instantiate the required classes, gather the data, format it, and send it back to the web browser. Otherwise, Drupal will return a 404 or 403 response.
The following sections of this topic provide an overview of the routing API. For more detailed information, see https://www.drupal.org/developing/api/8/routing
To register a route, add lines similar to this to a module_name.routing.yml file in your top-level module directory:
dblog.overview: path: '/admin/reports/dblog' defaults: _controller: '\Drupal\dblog\Controller\DbLogController::overview' _title: 'Recent log messages' requirements: _permission: 'access site reports'
Some notes:
See https://www.drupal.org/node/2092643 for more details about *.routing.yml files, and https://www.drupal.org/node/2122201 for information on how to set up dynamic routes. The Events topic is also relevant to dynamic routes.
Some routes have placeholders in them, and these can also be defined in a module_name.routing.yml file, as in this example from the Block module:
entity.block.edit_form: path: '/admin/structure/block/manage/{block}' defaults: _entity_form: 'block.default' _title: 'Configure block' requirements: _entity_access: 'block.update'
In the path, '{block}' is a placeholder - it will be replaced by the ID of the block that is being configured by the entity system. See the Entity API topic for more information.
For simple routes, after you have defined the route in a *.routing.yml file (see Registering simple routes above), the next step is to define a page controller class and method. Page controller classes do not necessarily need to implement any particular interface or extend any particular base class. The only requirement is that the method specified in your *.routing.yml file returns:
As a note, if your module registers multiple simple routes, it is usual (and usually easiest) to put all of their methods on one controller class.
If the route has placeholders (see Defining routes with placeholders above) the placeholders will be passed to the method (using reflection) by name. For example, the placeholder '{myvar}' in a route will become the $myvar parameter to the method.
Additionally, if a parameter is typed to one of the following special classes the system will pass those values as well.
Most controllers will need to display some information stored in the Drupal database, which will involve using one or more Drupal services (see the Services and container topic). In order to properly inject services, a controller should implement \Drupal\Core\DependencyInjection\ContainerInjectionInterface; simple controllers can do this by extending the \Drupal\Core\Controller\ControllerBase class. See \Drupal\dblog\Controller\DbLogController for a straightforward example of a controller class.
Name | Location | Description |
---|---|---|
ControllerBase | core/lib/Drupal/Core/Controller/ControllerBase.php | Utility base class for thin controllers. |
Name | Location | Description |
---|---|---|
RouteBuilderInterface | core/lib/Drupal/Core/Routing/RouteBuilderInterface.php | Rebuilds the route information and dumps it. |
RouteMatchInterface | core/lib/Drupal/Core/Routing/RouteMatchInterface.php | Provides an interface for classes representing the result of routing. |
© 2001–2016 by the original authors
Licensed under the GNU General Public License, version 2 and later.
Drupal is a registered trademark of Dries Buytaert.
https://api.drupal.org/api/drupal/core!lib!Drupal!Core!Routing!routing.api.php/group/routing/8.1.x