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