在 Symfony2.x 应用程序中使用开发模式时,通常在语言环境中工作。因此,此类功能无法按预期工作(例如,尝试获取 localhost 下的当前 IP)。这可能是一个问题,例如当人们尝试使用这种基于 IP 的 Web 服务时。因此,我只想知道如何检查控制器内部 Symfony2 应用程序是否在 dev 模式下运行。 通过这种方式,人们可以根据模式设置控制器的行为。
有什么想法吗?
要获取
Controller
中的当前环境,您可以使用:
$this->container->getParameter('kernel.environment');
因此,您只需将其放入
if()
语句中即可检查它是否等于 dev
。
从 Symfony 2.5 开始,可以这样做:
$this->container->get('kernel')->getEnvironment();
直接询问内核其环境看起来比搜索参数更好。
既然你想知道你是否处于开发模式(不一定是名为“dev”的环境),你可以从服务容器中检索内核并检查
isDebug
方法返回:
$kernel = $this->get('kernel');
$devMode = $kernel->isDebug();
如文档中所述(重点是我的),
重要但与环境主题无关的是
true
或false
argument 作为AppKernel
构造函数的第二个参数。这个 指定应用程序是否应在“调试模式”下运行。不管 环境中,Symfony 应用程序可以在设置的调试模式下运行 是真是假。这会影响应用程序中的许多事情,例如 在错误页面上显示堆栈跟踪或者缓存文件是否存在 根据每个请求动态重建。虽然不是必需的,但调试 对于开发和测试环境,模式通常设置为 true 对于产品环境为 false。 在内部,调试模式的值变为kernel.debug 服务容器内部使用的参数。
2017 和 Symfony 3.3+ 版本,使用 构造函数注入。
您可以只传递您需要的参数,而不是传递整个应用程序(=容器):
1.服务配置# app/config/services.yml
services:
_defaults:
autowire: true
App\Controller\SomeController:
arguments: ['%kernel.environment%']
如果你不理解这个语法,
查看这篇文章,在之前/之后的示例中解释 Symfony DI 新闻。
2.控制器namespace App\Controller;
final class SomeController
{
/**
* @var string
*/
private $environment;
public function __construct(string $environment)
{
$this->environment = $environment;
}
public function someAction()
{
$this->environment...
// any operations you need
}
}
一致性。
破窗理论(Coding Horror 很好地描述了版本)。任何接触代码的人更有可能选择不打算以这种方式使用的版本。
代码中的歧义是对遗留代码的第一个邀请$this->container
开始,几年后最终打电话给我寻求帮助,如何重写或重构整个静态地狱。
Symfony 5.1
$this->devEnvironment = 'dev' === getenv('APP_ENV');
APP_ENV=dev
添加到 .env.local 并将
APP_ENV=prod
添加到 .env 文件。取决于您是否有与我类似的环境设置
class MyService
{
private $params;
public function __construct(ParameterBagInterface $params)
{
$this->params = $params;
}
public function check($e)
{
if($this->params->get("kernel.environment") === "dev")
{
return true;
}
}
}
if ($this->getParameter('kernel.environment') === 'dev') {
// ...
}
kernel
。
services.yaml:
parameters:
app.environment: '%kernel.environment%'
...
您的控制器/服务:
class MyService
{
private $isDev;
public function __construct(ParameterBagInterface $appParams)
{
$this->isDev = $appParams->get('app.environment') === 'dev';
}
public function doSomething()
{
if ($this->isDev)
{
...
}
}
}
#[Autowire]
属性。在服务中:
<?php
class MyService
{
public function __construct(#[Autowire('%kernel.debug%')] bool $kernelDebug) {
dd($kernelDebug);
}
}
在控制器中,使用属性 #[Autowire]
作为操作(方法)参数:
// ...
class FooController extends AbstractController
{
#[Route('/foo')]
public function doSth(#[Autowire('%kernel.debug%')] bool $kernelDebug) {
dd($kernelDebug);
}
}
参见: