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



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

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

无需在控制器类中定义路由,而是可以在单独的 YAML、XML 或PHP文件中定义它们。主要优点是它们不需要任何额外的依赖关系。

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

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

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

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

这是我测试它的方式:

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

  2. 创建了一个routes.php文件:

//config/routes.php example
use AppController;
use SymfonyComponentRoutingLoaderConfiguratorRoutingConfigurator;
return function(RoutingConfigurator $routes)
{
$routes->add('schools_list', '/schools')
->controller([ControllerSchoolController::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: AppControllerSchoolController::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 文件加载路由(它甚至会尝试从扩展名为.yml的文件加载 YAML(。

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

你将准备好出发。

最新更新