将Symfony 4路由限制为“开发”环境

时间:2018-08-16 17:06:32

标签: php symfony routes symfony4

我正在使用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,路由中的条件仅公开ContextRequest对象,这两个对象(AFAICT)都不包含有关当前环境的任何信息。因此,除非我缺少任何东西,否则其他条件也将不起作用。

一种可能的解决方案,但(IMHO)不太好的解决方法是检查控制器中的$_SERVER['APP_ENV'] = 'dev'并抛出RouteNotFoundException,如果不是的话。

除了这样做,我真的很想要么让路由不在'dev'中时根本不可用,要么以某种方式定义路由以测试'dev'环境。

关于如何做到这一点的任何想法?最好使用注释。

1 个答案:

答案 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()方法属于您的应用,如果您的应用更加神秘,您可以根据自己的需求进行调整。您可以随时对其进行重写,以便它按照您偏好的特定顺序加载所需的路由。