将 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,路由中的条件仅公开 Context
和 Request
对象,它们(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>
我正在使用 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,路由中的条件仅公开 Context
和 Request
对象,它们(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>