修改其它路由

已定义的路由会以 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