42

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

任何的想法?

4

9 回答 9

61

要获取当前环境,Controller您可以使用:

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

因此,您只需将其放在if()语句中以检查它是否等于dev.

于 2012-10-21T13:13:16.007 回答
27

从 Symfony 2.5开始,它可以这样完成:

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

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

于 2015-04-24T10:42:21.363 回答
18

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

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

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

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

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

于 2016-10-26T13:54:23.003 回答
18

Symfony 3.3/4/5+ 解决方案

这是使用Constructor Injection的2017 和 Symfony 3.3+版本。

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

1.服务配置

# app/config/services.yml
services:
    _defaults:
        autowire: true

    App\Controller\SomeController:
        arguments: ['%kernel.environment%']

如果你不理解这个语法,请查看这篇解释 Symfony DI news in before/after examples 的帖子

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的代码开始,几年后最终打电话给我寻求帮助,如何重写或重构整个静态地狱。

于 2017-10-24T13:03:37.023 回答
5

Symfony 5.1

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

我在 Symfony 服务中使用它。您需要将该行添加APP_ENV=dev到 .env.local 和APP_ENV=prod.env 文件。取决于您是否有与我类似的环境设置

于 2020-07-14T22:38:48.133 回答
4

来自 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;
       }
    }
}
于 2019-12-04T12:23:44.180 回答
3

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

if ($this->getParameter('kernel.environment') === 'dev') {
    // ...
}
于 2020-04-08T12:02:00.337 回答
0

对于 Symfony 4.1+

我更喜欢避免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)
        {
            ...
        }
    }
}
于 2020-09-07T13:32:29.880 回答
-4

对于 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

于 2019-08-29T16:18:54.240 回答