在前缀根路径中找不到路由

时间:2019-11-07 11:57:25

标签: php symfony symfony-routing

我正在尝试在项目中设置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);
 }

1 个答案:

答案 0 :(得分:1)

我在路由器组件中戳了一下。 Trailing_slash_on_root功能是在加载程序过程中实现的。因此,我认为您需要在路由文件中进行设置。您没有提供管理路由文件外观的示例,因此我不太肯定。通常,我希望只会加载一个主路由文件,而该文件又会加载单个路由集,例如您的管理路由。

但是,以您发布的代码为例,我们可以实现railing_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);