已定义的路由会以 RouteCollection 对象形式在系统中存在,通过创建 EventSubscriber(事件订阅器)对 RoutingEvents::ALTER 事件进行响应,并对 RouteCollection 对象进行修改,可以实现对路由的修改。
当构建路由(启用模块或清除缓存)完成后,RoutingEvents::ALTER 事件会触发路由修改流程。\Drupal\Core\Routing\RouteSubscriberBase
类包含此事件的监听器,通过实现 alterRoutes(RouteCollection $collection)
方法可以对路由进行修改。
修改路由示例
使用 .services.yml 文件注册事件订阅器服务,以 example.services.yml 为例:
services:
example.route_subscriber:
class: Drupal\example\Routing\RouteSubscriber
tags:
- { name: event_subscriber }
创建对应类文件 src/Routing/RouteSubscriber.php
,扩展\Drupal\Core\Routing\RouteSubscriberBase
类并实现 alterRoutes()
方法
namespace Drupal\example\Routing;
use Drupal\Core\Routing\RouteSubscriberBase;
use Symfony\Component\Routing\RouteCollection;
/**
* Listens to the dynamic route events.
*/
class RouteSubscriber extends RouteSubscriberBase {
/**
* [email protected]}
*/
protected function alterRoutes(RouteCollection $collection) {
// Change path '/user/login' to '/login'.
if ($route = $collection->get('user.login')) {
$route->setPath('/login');
}
// Always deny access to '/user/logout'.
// Note that the second parameter of setRequirement() is a string.
if ($route = $collection->get('user.logout')) {
$route->setRequirement('_access', 'FALSE');
}
}
}
参考资料:Altering existing routes and adding new routes based on dynamic ones