Php 检查是否在“中”;发展";带Symfony的控制器内的模式

Php 检查是否在“中”;发展";带Symfony的控制器内的模式,php,symfony,dependency-injection,controller,containers,Php,Symfony,Dependency Injection,Controller,Containers,当对Symfony2.x应用程序使用dev模式时,通常在locale中工作。因此,这样的函数不能按预期工作(例如,尝试在localhost下获取当前IP)。这可能是一个问题,例如,当一个人试图使用这种基于ip的web服务时。因此,我只想知道如何在控制器内部检查Symfony2应用程序是否在开发模式下运行。 通过这种方式,可以根据模式设置控制器的行为 有什么想法吗?要在控制器中获取当前环境,可以使用: $this->container->getParameter('kernel.env

当对Symfony2.x应用程序使用dev模式时,通常在locale中工作。因此,这样的函数不能按预期工作(例如,尝试在localhost下获取当前IP)。这可能是一个问题,例如,当一个人试图使用这种基于ip的web服务时。因此,我只想知道如何在控制器内部检查Symfony2应用程序是否在开发模式下运行。 通过这种方式,可以根据模式设置控制器的行为


有什么想法吗?

要在
控制器中获取当前环境,可以使用:

$this->container->getParameter('kernel.environment');

因此,您只需将其放入一个
if()
语句中,以检查它是否等于自Symfony2.5以来的
dev
,可以按以下方式执行:

$this->container->get('kernel')->getEnvironment();

直接询问内核的环境看起来比搜索参数更好。

因为您想知道自己是否处于开发模式(不一定是名为“dev”的环境),您可以从服务容器中检索内核并检查
isDebug
方法返回:

$kernel = $this->get('kernel');
$devMode = $kernel->isDebug();
如前所述(重点是我的)

重要但与环境主题无关的是
true
false
参数作为
AppKernel
构造函数的第二个参数这个 指定应用程序是否应在“调试模式”下运行。不管 在该环境中,Symfony应用程序可以在设置调试模式的情况下运行 设置为真或假。这会影响应用程序中的许多事情,例如 在错误页上显示堆栈跟踪,或者如果缓存文件 根据每个请求动态重建。虽然不是必需的,但调试 对于开发和测试环境以及 对于prod环境,为false

在内部,调试模式的值变为kernel.debug 在服务容器内使用的参数

Symfony 3.3/4/5+解决方案 这里是2017年的和使用构造函数注入的Symfony 3.3+版本

您可以只传递所需的参数,而不是传递整个应用程序(=容器):

1.服务配置 如果您不理解此语法

2.控制器

为什么要避免在控制器中传递容器? 代码中最重要的是一致性

  • 如果您喜欢静态和服务定位器(=您可以通过任何地方获得任何其他服务的服务),请使用它

  • 如果您更喜欢构造函数注入,请使用树依赖关系图(!=循环依赖关系)

如果你知道为什么要这样使用它们,那么混合这个概念对你来说可能没问题。但这是游戏。查看代码的任何人都更有可能选择不打算以这种方式使用的版本

代码中的歧义是对遗留代码的第一个邀请 我指导过许多应用程序团队,他们从代码中简单的
$this->container
开始,几年后打电话给我寻求帮助,询问如何重写或重构整个静态地狱。

适用于Symfony 4.x及更高版本 如果您正在使用
.env
存储环境变量,只需使用
$\u env['name-of-variable']
即可在任何控制器中访问它们

对于默认安装,有一个
$\u ENV[“APP\u ENV”]
变量可用,它将告诉您是否处于开发模式


使用
print\r($\u ENV)以查看所有可用的环境变量

[ps-这也适用于Symfony 3.4]



参考Symfony 4.1内部服务

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;
       }
    }
}

在Symfony 4及更高版本中,您可以简单地使用:

if ($this->getParameter('kernel.environment') === 'dev') {
    // ...
}

Symfony 5.1

$this->devEnvironment='dev'==getenv('APP_ENV')

我在Symfony服务中使用这个。您需要将行
APP_ENV=dev
添加到.ENV.local,将行
APP_ENV=prod
添加到.ENV文件。取决于您是否有与我类似的Symfony 4.1环境设置+ 我宁愿避免在控制器和服务中使用
内核

服务。yaml:

参数:
app.environment:“%kernel.environment%”
...
您的控制器/服务:

classmyservice
{
私人部门$isDev;
公共函数构造(参数BagInterface$appParams)
{
$this->isDev=$appParams->get('app.environment')='dev';
}
公共函数doSomething()
{
如果($this->isDev)
{
...
}
}
}

我可以建议您看看我的答案吗?我认为这比公认的答案更合适。我认为这与将容器传递到依赖注入容器之外的任何地方有关。这是一个糟糕的做法,因为树木是圆形的。如果你需要,我可以提供完整的答案。@TomášVotruba:请回答。从我的观点来看,从容器中检索这样的meta是无害的,因为它只使用了对容器的引用,而容器是DIC的
公共属性。如果Symfony开发人员希望它被认为是不好的做法,他们宁愿创建用于封装的快捷方法。完成后,我尝试添加了一些您要求的解释。这是另一个话题,它会使答案不那么可读,所以我试着让它简短。明确检查链接,它解释了很多:)“如果Symfony开发人员希望它被视为不好的做法…”-这些更改需要时间,因为包括leader在内的许多人都必须同意这些更改。这就是为什么一些框架从2015年起默认使用构造函数注入,Symfony一直等到2017年底,Symfony 4。@TomášVotruba:软件开发的又一天:)很好,但是使用
'%kernel.debug%'
而不是
'%kernel.environment%'
bool$isDebugclass 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') {
    // ...
}