Изменение динамического маршрута в Drupal 8 с помощью RouteSubscriber

#symfony #drupal-8 #drupal-routes

#symfony #drupal-8 #drupal-маршруты

Вопрос:

У меня есть веб-приложение, созданное на Drupal 8, и у меня есть некоторые проблемы с маршрутизацией. Пользователи будут входить в систему с помощью внешней службы, и после входа в систему они отправляются по пути /user/{user}, где {user} — их идентификатор пользователя. Я хочу изменить это поведение и отправить их на страницу / панель мониторинга. Не имея доступа к тому, что делает внешняя служба маршрутизации, мне нужно перенаправить /user/{user} в /dashboard . Похоже, что модуль перенаправления drupal 8 может решить проблему, но я не слишком заинтересован в использовании внешнего модуля только для этой простой задачи.

Из-за этого я попытался изменить маршрут с помощью методов RouteSubscriber и alterRoutes в drupal. Итак, я создал свой класс RouteSubscriber в своем модуле под названием «module» следующим образом:

 class RouteSubscriber extends RouteSubscriberBase {

  protected function alterRoutes(RouteCollection $collection) {
    if ($route = $collection->get('user.page')) {
      $route->setDefaults(array(
        '_controller' => 'DrupalmoduleControllerDashboard::content',
      ));
    }

    if ($route = $collection->get('entity.user.canonical')) {    
      $route->setDefaults(array(
        '_controller' => 'DrupalmoduleControllerDashboard::content',
      ));
    }

  }
}
 

Маршрут user.page имеет path /user, а путь entity.user.canonical — это интересующий меня маршрут, который имеет path /user/{user}, где {user} снова является параметром пути. Когда я перехожу на страницу / пользователя, панель мониторинга отображается, как и ожидалось, но при переходе, например, в /user/123 панель мониторинга не отображается, но, похоже, отображается то, что изначально делал маршрут. Просто чтобы проверить, невозможно ли изменить этот маршрут, я попытался настроить отображение панели мониторинга для всех маршрутов, вставив следующий код в RouteSubscriber:

 foreach ($collection->all() as $route) {
 $route->setDefaults(array(
   '_controller' => 'DrupalmoduleControllerDashboard::content',
   'pid' => '',
   'uid' => '',
   'modifier' => '',
   'display' => '',
 ));  
}
 

Нежелательные pid, uid, модификатор и отображение — это просто параметры по умолчанию для разных маршрутов, поэтому код будет выполняться. Это позволяет странице / пользователю / 123 корректно отображать панель мониторинга! Тем не менее, я получаю следующее сообщение об ошибке в нижней части экрана:

 The website encountered an unexpected error. Please try again later.
SymfonyComponentRoutingExceptionMissingMandatoryParametersException: Some mandatory parameters are missing ("filter") to generate a URL for route "devel.configs_list". in DrupalCoreRoutingUrlGenerator->doGenerate() (line 182 of core/lib/Drupal/Core/Routing/UrlGenerator.php). 
 

Итак, что я здесь делаю не так? Можно ли сделать то, что я хочу, или я должен сделать что-то другое, чтобы достичь того, чего я хочу? Кроме того, не стесняйтесь запрашивать больше кода, если это необходимо!