限制 Symfony 4 路由到“dev”环境

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 文档,路由中的条件仅公开ContextRequest对象,两者(AFAICT)都不包含有关当前环境的任何信息。所以,除非我遗漏了什么,否则其他条件也不起作用。

一种可能的,但(恕我直言)不优雅的解决方案是$_SERVER['APP_ENV'] = 'dev'在控制器中检查它,RouteNotFoundException如果没有则抛出一个。

而不是这样做,我真的希望要么在不在“开发”中时根本不可用路线,要么以某种方式定义路线以测试“开发”环境。

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

yiv*_*ivi 8

如果您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()方法属于您的应用程序,如果它们更深奥,您可以根据需要自由调整它。您可以随时重写它,以便它按照您喜欢的特定顺序加载您想要的路线。


显然,您也可以使用“条件”(此处记录)来定义相同的路由,但在运行时评估它是否根据特定情况适用。:

例如,如这里的答案所示,使用注释:

/**
 * @Route("/my_route", condition="'dev' === '%kernel.environment%'")
 */
Run Code Online (Sandbox Code Playgroud)

或者使用 YAML 配置,就像在这个答案中一样

my_route:
    path:       /my_route}
    defaults:   { _controller: App\Controller\MyRouteController }
    condition:  "%kernel.environment% === 'dev'"
Run Code Online (Sandbox Code Playgroud)

或者使用 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)