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