#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).
Итак, что я здесь делаю не так? Можно ли сделать то, что я хочу, или я должен сделать что-то другое, чтобы достичь того, чего я хочу? Кроме того, не стесняйтесь запрашивать больше кода, если это необходимо!