我很难尝试使用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
的路由配置就像一个魅力。
这是我测试它的方式:
-
创建了一个控制器(省略,因为它不相关,任何控制器都可以(
-
创建了一个
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']);
};
- 运行
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: AppControllerSchoolController::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()
如下所示:
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");
}
你将准备好出发。