使用 Symfony 检查控制器内是否处于“dev”模式

问题描述 投票:0回答:10

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

有什么想法吗?

php symfony dependency-injection controller containers
10个回答
63
投票

要获取

Controller
中的当前环境,您可以使用:

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

因此,您只需将其放入

if()
语句中即可检查它是否等于
dev


28
投票

从 Symfony 2.5 开始,可以这样做:

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

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


19
投票

既然你想知道你是否处于开发模式(不一定是名为“dev”的环境),你可以从服务容器中检索内核并检查

isDebug
方法返回:

$kernel = $this->get('kernel');
$devMode = $kernel->isDebug();

如文档中所述(重点是我的),

重要但与环境主题无关的是

true

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

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


18
投票
Symfony 3.3/4/5+ 解决方案

这里是

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


为什么要避免在Controller中传递Container?

代码中最重要的是

一致性

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

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

如果您知道为什么这样使用它们,那么混合这个概念可能对您来说没问题。但现在开始玩

破窗理论(Coding Horror 很好地描述了版本)。任何接触代码的人更有可能选择不打算以这种方式使用的版本

代码中的歧义是对遗留代码的第一个邀请

我指导过许多应用程序的团队,从代码中简单的

$this->container

开始,几年后最终打电话给我寻求帮助,如何重写或重构整个静态地狱。


7
投票

Symfony 5.1

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


我在 Symfony 服务中使用它。您需要将行

APP_ENV=dev

 添加到 .env.local 并将 
APP_ENV=prod
 添加到 .env 文件。取决于您是否有与我类似的环境设置


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

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

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

4
投票
对于 Symfony 4.1+

我更愿意避免在我的控制器和服务中使用

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) { ... } } }
    

0
投票
适用于 Symfony 4.x 及以上版本

如果您使用

.env

 来存储环境变量,则只需使用 
$_ENV['name-of-variable']
 即可在
任何控制器
中访问它们

对于默认安装,有一个可用的

$_ENV["APP_ENV"]

 变量,它会告诉您是否处于开发模式。


使用

print_r($_ENV);

 查看所有可用的环境变量。

[ps - 这也适用于 Symfony 3.4]


参考 - https://symfony.com/doc/4.3/components/dotenv.html


0
投票
从 Symfony 6.1 开始,您可以使用

#[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); } }
参见:

  • https://symfony.com/blog/new-in-symfony-6-1-service-autowiring-attributes
  • https://symfony.com/doc/current/service_container/autowiring.html
© www.soinside.com 2019 - 2024. All rights reserved.