在前缀根路径中找不到路由
Route Not Found In Prefix Root Path
我正在尝试在我的项目中设置 symfony/routing 组件..
一切顺利,但是当我为路由定义前缀时,它会抛出路由未找到此前缀的根路径的异常。
例如,假设我有一堆管理路由。我没有在每条路线上定义 "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);
}
我在路由器组件中查了一下。 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);
我正在尝试在我的项目中设置 symfony/routing 组件..
一切顺利,但是当我为路由定义前缀时,它会抛出路由未找到此前缀的根路径的异常。
例如,假设我有一堆管理路由。我没有在每条路线上定义 "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);
}
我在路由器组件中查了一下。 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);