当在Symfony2.x应用程序中使用开发模式时,通常在语言环境中工作。因此,此类功能无法按预期工作(例如,尝试获取 localhost 下的当前 IP)。这可能是一个问题,例如当尝试使用这种基于 ip 的 Web 服务时。因此,我只想知道如何在控制器内部检查 Symfony2 应用程序是否在开发模式下运行。通过这种方式,可以根据模式设置控制器的行为。
任何的想法?
当在Symfony2.x应用程序中使用开发模式时,通常在语言环境中工作。因此,此类功能无法按预期工作(例如,尝试获取 localhost 下的当前 IP)。这可能是一个问题,例如当尝试使用这种基于 ip 的 Web 服务时。因此,我只想知道如何在控制器内部检查 Symfony2 应用程序是否在开发模式下运行。通过这种方式,可以根据模式设置控制器的行为。
任何的想法?
要获取当前环境,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
orfalse
参数作为AppKernel
构造函数的第二个参数。这指定应用程序是否应该在“调试模式”下运行。无论环境如何,Symfony 应用程序都可以在调试模式设置为 true 或 false 的情况下运行。这会影响应用程序中的许多事情,例如在错误页面上显示堆栈跟踪,或者是否在每个请求上动态重建缓存文件。尽管不是必需的,但调试模式通常设置为开发和测试环境的 true 和 prod 环境的 false。在内部,调试模式的值成为服务容器内部使用的 kernel.debug 参数。
这是使用Constructor Injection的2017 和 Symfony 3.3+版本。
而不是传递给你整个应用程序(=容器),你可以只传递你需要的参数:
# app/config/services.yml
services:
_defaults:
autowire: true
App\Controller\SomeController:
arguments: ['%kernel.environment%']
如果你不理解这个语法,请查看这篇解释 Symfony DI news in before/after examples 的帖子。
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');
我在 Symfony 服务中使用它。您需要将该行添加APP_ENV=dev
到 .env.local 和APP_ENV=prod
.env 文件。取决于您是否有与我类似的环境设置
来自 Symfony 4.1 内部的 Service
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') {
// ...
}
我更喜欢避免kernel
在我的控制器和服务中使用。
服务.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)
{
...
}
}
}
如果您.env
用于存储环境变量,您可以在任何控制器中访问它们,只需使用$_ENV['name-of-variable']
对于默认安装,有一个$_ENV["APP_ENV"]
变量可用,它将告诉您是否处于开发模式。
用于print_r($_ENV);
查看所有可用的环境变量。
[ps - 这也适用于 Symfony 3.4]