gpt4 book ai didi

php - 为什么 Symfony 5.1 不能识别 "routes.php"文件上配置的路由?

转载 作者:行者123 更新时间:2023-12-04 00:00:48 25 4
gpt4 key购买 nike

我很难尝试使用 config/routes.php 配置我的路由Symfony 5.1 中的文件。

根据 Symfony routing documentation ,我应该能够在 PHP 文件中配置我的路由:

Instead of defining routes in the controller classes, you can define them in a separate YAML, XML or PHP file. The main advantage is that they don't require any extra dependency.



但实际上,Symfony 仅在我将路由放入文件 routes.yaml 时才识别路由。 .

在文件中配置的路由 路线.php 导致错误“找不到用于“GET/某事”的路由(404 Not Found)”。运行时 debug:router ,这些路线没有列出。

routes.yaml 中配置相同的路由时效果很好.

在另一个项目中使用 Symfony 5.0.8 , 路由配置通过 routes.php就像一个魅力。

我是这样测试的:
  • 创建了一个 Controller (省略,因为它不相关,任何 Controller 都可以)
  • 创建了一个 routes.php文件:

  • //config/routes.php example

    use App\Controller;
    use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;

    return function(RoutingConfigurator $routes)
    {
    $routes->add('schools_list', '/schools')
    ->controller([Controller\SchoolController::class, 'list'])
    ->methods(['GET']);
    };
  • 运行 debug:router将导致:
  •  ---------------- -------- -------- ------ -------------------------- 
    Name Method Scheme Host Path
    ---------------- -------- -------- ------ --------------------------
    _preview_error ANY ANY ANY /_error/{code}.{_format}
    ---------------- -------- -------- ------ --------------------------
  • routes.yaml里面配置了相同的路由:

  • #config/routes.yaml
    schools_list:
    path: /schools
    controller: App\Controller\SchoolController::list
    methods: GET
  • 运行 debug:router将导致:
  •  ---------------- -------- -------- ------ -------------------------- 
    Name Method Scheme Host Path
    ---------------- -------- -------- ------ --------------------------
    _preview_error ANY ANY ANY /_error/{code}.{_format}
    schools_list GET ANY ANY /schools
    ---------------- -------- -------- ------ --------------------------

    最佳答案

    在 Symfony < 5.1 上,默认 Kernel::configureRoutes()看起来像 this :

    protected function configureRoutes(RouteCollectionBuilder $routes): void
    {
    $confDir = $this->getProjectDir().'/config';

    $routes->import($confDir.'/{routes}/'.$this->environment.'/*'.self::CONFIG_EXTS, '/', 'glob');
    $routes->import($confDir.'/{routes}/*'.self::CONFIG_EXTS, '/', 'glob');
    $routes->import($confDir.'/{routes}'.self::CONFIG_EXTS, '/', 'glob');
    }

    特别通知 Kernel::CONFIG_EXTS , 其中 is set to :
    private const CONFIG_EXTS = '.{php,xml,yaml,yml}';

    所以它会尝试从 PHP、XML 或 YAML 文件加载路由(它甚至会尝试从带有 .yml 扩展名的文件加载 YAML)。

    但是在 Symfony 5.1+ 上,这个方法 has been changed to :
    protected function configureRoutes(RoutingConfigurator $routes): void
    {
    $routes->import('../config/{routes}/'.$this->environment.'/*.yaml');
    $routes->import('../config/{routes}/*.yaml');
    $routes->import('../config/{routes}.yaml');
    }

    现在它只尝试默认加载 YAML 文件。是的,伤心。但它有一个非常简单的修复方法。

    (另请注意, RouteCollectionBuilder 已被替换为 RoutingConfigurator ,因为类型提示前者在 5.1 上已被 弃用 )。

    只需更改您的 Kernel::configureRoutes()说明您的 PHP 文件:
    protected function configureRoutes(RoutingConfigurator $routes): void
    {
    $extensions = '{php,yaml}';

    $routes->import('../config/{routes}/' . $this->environment . "/*.$extensions");
    $routes->import("../config/{routes}/*.$extensions");
    $routes->import("../config/{routes}.$extensions");
    }

    您将准备好出发。

    关于php - 为什么 Symfony 5.1 不能识别 "routes.php"文件上配置的路由?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62160689/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com