[英]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
进行路由配置就像一个魅力。
这就是我测试它的方式:
创建了一个 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()
看起来像这样:
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.