mcm*_*phy 6 php routes symfony symfony4
我正在使用 Symfony 4.1。我正在尝试创建一个只能从“开发”环境中访问的路由“/dev/import/{file}”。
Symfony 2 的这个答案建议将路由routing_dev.yml添加condition: "request.getScriptName() == '/app_dev.php'"到或添加到您的路由定义。
这两种选择都不起作用。在 Symfony 4 中没有routing_dev.yml,现在是dev\routing_dev.YAML,据我所知只是配置(即你不能在那里创建路由)。必须定义routes.yaml适用于所有环境的路线。
添加路由routes.yaml和应用条件也不起作用,因为我们试图匹配app_dev前端控制器,它已在 Symfony 4 中删除。
根据Symfony 4 文档,路由中的条件仅公开Context和Request对象,两者(AFAICT)都不包含有关当前环境的任何信息。所以,除非我遗漏了什么,否则其他条件也不起作用。
一种可能的,但(恕我直言)不优雅的解决方案是$_SERVER['APP_ENV'] = 'dev'在控制器中检查它,RouteNotFoundException如果没有则抛出一个。
而不是这样做,我真的希望要么在不在“开发”中时根本不可用路线,要么以某种方式定义路线以测试“开发”环境。
关于如何做到这一点的任何想法?最好使用注释。
如果您configureRoutes()在生成的Kernel类上看到默认方法:
protected function configureRoutes(RouteCollectionBuilder $routes)
{
$confDir = $this->getProjectDir().'/config';
$routes->import($confDir.'/{routes}/*'.self::CONFIG_EXTS, '/', 'glob');
$routes->import($confDir.'/{routes}/'.$this->environment.'/**/*'.self::CONFIG_EXTS, '/', 'glob');
$routes->import($confDir.'/{routes}'.self::CONFIG_EXTS, '/', 'glob');
}
Run Code Online (Sandbox Code Playgroud)
第二个import()电话是这样写的:
$routes->import($confDir.'/{routes}/'.$this->environment.'/**/*'.self::CONFIG_EXTS, '/', 'glob');
Run Code Online (Sandbox Code Playgroud)
这将尝试加载下定义的路由config/routes/[environment]。
所以如果你在dev那里创建一个文件夹并在那里添加你的路由,那些只会在特定环境中加载。从逻辑上讲,这也可用于为其他可能的环境定义特定的专用路由,尽管通常这不会特别有用。
当然,生成的configureRoutes()方法属于您的应用程序,如果它们更深奥,您可以根据需要自由调整它。您可以随时重写它,以便它按照您喜欢的特定顺序加载您想要的路线。
显然,您也可以使用“条件”(此处记录)来定义相同的路由,但在运行时评估它是否根据特定情况适用。:
例如,如这里的答案所示,使用注释:
Run Code Online (Sandbox Code Playgroud)/** * @Route("/my_route", condition="'dev' === '%kernel.environment%'") */
或者使用 YAML 配置,就像在这个答案中一样:
Run Code Online (Sandbox Code Playgroud)my_route: path: /my_route} defaults: { _controller: App\Controller\MyRouteController } condition: "%kernel.environment% === 'dev'"
或者使用 XML 配置:
protected function configureRoutes(RouteCollectionBuilder $routes)
{
$confDir = $this->getProjectDir().'/config';
$routes->import($confDir.'/{routes}/*'.self::CONFIG_EXTS, '/', 'glob');
$routes->import($confDir.'/{routes}/'.$this->environment.'/**/*'.self::CONFIG_EXTS, '/', 'glob');
$routes->import($confDir.'/{routes}'.self::CONFIG_EXTS, '/', 'glob');
}
Run Code Online (Sandbox Code Playgroud)