【问题标题】:Route Not Found In Prefix Root Path在前缀根路径中找不到路由
【发布时间】:2020-03-04 00:12:18
【问题描述】:

我正在尝试在我的项目中设置 symfony/路由组件..

一切顺利,但是当我为路由定义前缀时,它会为该前缀的根路径抛出 route not found 异常。

例如,假设我有一堆管理路由。我没有在每条路由上定义“admin”关键字,而是为所有这些设置了前缀路由。所以我的仪表板路径从"/admin" 变成了"/"。现在它抛出找不到路由错误..

当我检查路线集合时。仪表板路径似乎为"/admin/"。而且它与REQUEST_URI不匹配

我是否设置了组件不当或需要注意一些事项?

这里是RouteProvider的一部分

foreach (scanDirectory(ROOT_PATH . "/routes") as $file) {
    $subCollection = new RouteCollection();
    $filepath = ROOT_PATH . "/routes/" . $file;
    $routes = Yaml::parseFile($filepath);

    $prefix = "api";

    if (array_key_exists("prefix", $routes)){
        $prefix =  $routes["prefix"];
        unset($routes["prefix"]);
    }

    foreach ($routes as $name => $route) {
        $parameters = (new RouteParser($route))->parse();
        $subCollection->add(
            $name,
            new Route(...$parameters)
        );
    }
    $subCollection->addPrefix($prefix);
    $subCollection->addOptions([
        "trailing_slash_on_root" => false
    ]);
    $collection->addCollection($subCollection);
 }

【问题讨论】:

  • 那么 /admin/ 是唯一给您带来问题的途径吗?您可能需要将 trailing_slash_on_root 配置为 false。如果链接没有帮助,请考虑更新您的问题以显示您如何配置路线。
  • @Cerad 我将它添加为路由收集的选项,但没有任何改变。
  • 再次,您确实需要显示一些代码。有多种方法可以配置路由并匹配它们。如果编写一个最小的测试用例可以揭示解决方案,我不会感到惊讶。
  • @Cerad 抱歉这个问题。我之前没有分享任何代码,因为我认为我遗漏了一些东西。如果我很好地解释了我的问题,就不需要代码了。现在我更新了我的问题并分享了我的路线提供者的某些部分。

标签: php symfony symfony-routing


【解决方案1】:

我在路由器组件中浏览了一下。 trailing_slash_on_root 功能是作为加载程序的一部分实现的。所以我认为你需要在你的路由文件中设置它。您没有提供管理路由文件的示例,所以我不肯定。通常我希望看到只加载一个主路由文件,该文件又会加载单独的路由集,例如您的管理路由。

但是,以您发布的代码为例,我们可以实现 trailing_slash_on_root 使用的相同过程。基本上,在所有处理发生后,我们显式删除仪表板路由的尾部斜杠。这是一个完整的独立工作示例,主要取自路由组件文档:

$rootCollection = new RouteCollection();
$adminCollection = new RouteCollection();

$route = new Route('/users',['_controller' => 'admin_users_controller']);
$adminCollection->add('admin_users',$route);

$route = new Route('/',['_controller' => 'admin_dashboard_controller']);
$adminCollection->add('admin_dashboard',$route);

$adminCollection->addPrefix('/admin'); # This actually adds the prefix

# *** Explicitly tweak the processed dashboard route ***
$route = $adminCollection->get('admin_dashboard');
$route->setPath('/admin');

$rootCollection->addCollection($adminCollection);

$context = new RequestContext('/');

// Routing can match routes with incoming requests
$matcher = new UrlMatcher($rootCollection, $context);
$parameters = $matcher->match('/admin/users');
var_dump($parameters);

$parameters = $matcher->match('/admin');
var_dump($parameters);

【讨论】:

  • 你的解决方案很好,但我需要一些动态的东西来修复所有路线。
  • 您不使用可用的route loading 功能的任何原因?基本上只需要添加 symfony/config 组件。似乎可以为您省去很多麻烦。或者,如果您想坚持自己的解决方案,请在路由组件中搜索 $trailingSlashOnRoot 以了解如何实现更通用的方法。
  • 我已经在使用另一个配置加载器。我不想为此改变整个系统。但我非常感谢你的努力,如果你不帮助我,我不知道
猜你喜欢
  • 1970-01-01
  • 2016-09-28
  • 2019-08-25
  • 1970-01-01
  • 1970-01-01
  • 2019-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多