我正在使用Symfony 4.1。我正在尝试创建只能从“开发”环境中访问的路由“ / dev / import / {file}”。
This answer for 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 Documentation,路由中的条件仅公开Context
和Request
对象,这两个对象(AFAICT)都不包含有关当前环境的任何信息。因此,除非我缺少任何东西,否则其他条件也将不起作用。
一种可能的解决方案,但(IMHO)不太好的解决方法是检查控制器中的$_SERVER['APP_ENV'] = 'dev'
并抛出RouteNotFoundException
,如果不是的话。
除了这样做,我真的很想要么让路由不在'dev'中时根本不可用,要么以某种方式定义路由以测试'dev'环境。
关于如何做到这一点的任何想法?最好使用注释。
答案 0 :(得分:2)
使用注释是不可能的。
但是如果您在生成的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');
}
第二个import()
呼叫为:
$routes->import($confDir.'/{routes}/'.$this->environment.'/**/*'.self::CONFIG_EXTS, '/', 'glob');
这将尝试加载在config/routes/[environment]
下定义的路由。
因此,如果您在此处创建一个dev
文件夹并在其中添加路由,则只有在该特定环境中才会加载这些路由。从逻辑上讲,它也可以用于为其他可能的环境定义特定的,专用的路由,尽管通常这并不是特别有用。
当然,生成的configureRoutes()
方法属于您的应用,如果您的应用更加神秘,您可以根据自己的需求进行调整。您可以随时对其进行重写,以便它按照您偏好的特定顺序加载所需的路由。