1

我有一个用 Drupal 8 制作的网络应用程序,但我遇到了一些路由问题。用户将使用外部服务登录,登录后他们被发送到路径 /user/{user},其中 {user} 是他们的用户 ID。我想改变这种行为并将它们发送到页面/仪表板。无法访问外部服务路由正在做什么,我需要将 /user/{user} 重新路由到 /dashboard。似乎drupal 8 重定向模块可以解决这个问题,但我不太热衷于使用外部模块来完成这个简单的任务。

因此,我尝试使用drupal 的 RouteSubscriber 和 alterRoutes 方法更改路由。因此,我在名为“module”的模块中创建了 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 有路径 /user,路径 entity.user.canonical 是我感兴趣的路径,它有路径 /user/{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、修饰符和 display 只是默认为不同的路由路径参数,因此代码将运行。这使得页面 /user/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). 

那么,我在这里做错了什么?我想做的事可以完成,还是我应该做一些不同的事情来实现我想要的?另外,如果需要,请随时询问更多代码!

4

0 回答 0