将 Symfony 4 路由限制到 "dev" 环境

Restrict Symfony 4 route to the "dev" environment

我正在使用 Symfony 4.1。我正在尝试创建只能从 'dev' 环境中访问的路由“/dev/import/{file}”。

This answer 对于 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)都不包含有关当前环境的任何信息。所以,除非我遗漏了什么,否则其他条件也不行。

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

与其那样做,我真的很想在不在 'dev' 时让路由不可用,或者以某种方式定义路由以测试 'dev' 环境。

关于如何做到这一点有什么想法吗?最好使用注释。

如果在生成的 Kernel 上看到默认的 configureRoutes() 方法 class:

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


显然,你也可以使用'conditions'(documented here)来定义相同的路由,但根据具体情况在运行时评估是否适用。:

this answer here所示使用注解:

/**
 * @Route("/my_route", condition="'dev' === '%kernel.environment%'")
 */

或使用 YAML 配置,如 this answer:

my_route:
    path:       /my_route}
    defaults:   { _controller: App\Controller\MyRouteController }
    condition:  "%kernel.environment% === 'dev'"

或使用XML配置:

<!-- config/routes.xml -->
<?xml version="1.0" encoding="UTF-8" ?>
<routes xmlns="http://symfony.com/schema/routing"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/routing
        https://symfony.com/schema/routing/routing-1.0.xsd">

    <route id="my_route" path="/my_route" controller="App\Controller\MyRouteController">
        <condition>%kernel.environment% === 'dev'</condition>
    </route>
</routes>