繁体   English   中英

为什么 Symfony 5.1 不能识别“routes.php”文件中配置的路由?

[英]Why doesn't Symfony 5.1 recognize routes configured on a “routes.php” file?

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

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

您可以在单独的 YAML、XML 或Z2FEC392304A5C23AC138FDA22文件中定义它们,而不是在 controller 类中定义路由。 主要优点是它们不需要任何额外的依赖。

但在实践中,Symfony 仅在我将路线放入文件routes.yaml时才识别路线。

在文件routes.php中配置的路由会导致错误“找不到“GET /something”的路由(404 Not Found)”。 运行debug:router时,不会列出这些路由。

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

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

这就是我测试它的方式:

  1. 创建了一个 controller(省略,因为它不相关,任何 controller 都可以)

  2. 创建了一个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']);
};
  1. 运行debug:router将导致:
 ---------------- -------- -------- ------ -------------------------- 
  Name             Method   Scheme   Host   Path                      
 ---------------- -------- -------- ------ -------------------------- 
  _preview_error   ANY      ANY      ANY    /_error/{code}.{_format}  
 ---------------- -------- -------- ------ -------------------------- 
  1. routes.yaml内配置相同的路由:
#config/routes.yaml
schools_list:
    path: /schools
    controller: App\Controller\SchoolController::list
    methods: GET
  1. 运行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()看起来像这样

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设置为

private const CONFIG_EXTS = '.{php,xml,yaml,yml}';

因此它将尝试从 PHP、XML 或 YAML 文件加载路由(它甚至会尝试从扩展名为 Z9463F87BBED1FCDACFB8D40E18 的文件加载.yml文件)

但在 Symfony 5.1+ 上,此方法已更改为

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");
}

您将准备好 go。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM