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

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

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

      class RouteSubscriber extends RouteSubscriberBase {

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

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

  }
}

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

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

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

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

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

0 ответов

Другие вопросы по тегам