1

I have a web-app made in Drupal 8, and I have some routing problems. Users will login using an external service, and after login they are sent to the path /user/{user}, where {user} is their user id. I want to change this behaviour and send them to a page /dashboard. Not having access to what the external service routing is doing, I need to reroute /user/{user} to /dashboard. It seems like the drupal 8 redirect module could solve the problem, but I am not too keen on using an external module just for this simple task.

Because of this, I tried to change the route with drupal's RouteSubscriber and alterRoutes method. So I made my RouteSubscriber class in my module called "module" like this:

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',
      ));
    }

  }
}

The route user.page has path /user, and the path entity.user.canonical is the route I'm interested in, which has path /user/{user}, where {user} is again a path parameter. When I go to the page /user, the dashboard is displayed as expected, but going to for example /user/123 does not show the dashboard, but seems display what the route originally did. Just to test whether it was impossible to alter this route, I tried to set all routes to have display the dashboard by inserting the following code into RouteSubscriber:

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

The junk pid, uid, modifier and display are just defaults to different routes path parameters so the code will run. This makes the page /user/123 correctly display the dashboard! However, I do get the following error message at the bottom of the screen:

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). 

So, what am I doing wrong here? Can what I want be done, or should I do something different to achieve what I want? Also, feel free to ask for more code if needed!

David Oliver
  • 2,424
  • 1
  • 24
  • 37
Richard Jensen
  • 176
  • 1
  • 14
  • Hi, did you ever solve this problem? I'm having the same problem, could you share? – GoingDrupal Jul 22 '22 at 14:48
  • Hey there. I can't recall what we ended up doing, but I will ask my colleges if they remember. If we found a solution, I will write it as an answer to this post. – Richard Jensen Aug 01 '22 at 09:32

0 Answers0