使用Symfony2.x检查控制器内是否处于"dev"模式

Jea*_*ean 35 php containers dependency-injection controller symfony

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

任何的想法?

tol*_*gap 53

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

$this->container->getParameter('kernel.environment');
Run Code Online (Sandbox Code Playgroud)

所以你只需将它放在一个if()声明中,检查它是否等于dev.


Dam*_*nic 25

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

$this->container->get('kernel')->getEnvironment();
Run Code Online (Sandbox Code Playgroud)

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

  • @TomášVotruba:软件开发的另一天:) (2认同)

Vev*_*eve 14

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

$kernel = $this->get('kernel');
$devMode = $kernel->isDebug();
Run Code Online (Sandbox Code Playgroud)

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

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

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


Tom*_*uba 9

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

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

1.服务配置

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

    App\Controller\SomeController:
        arguments: ['%kernel.environment%']
Run Code Online (Sandbox Code Playgroud)

如果您不理解这种语法,请查看此帖子,在前/后示例中解释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
    }
}
Run Code Online (Sandbox Code Playgroud)


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

代码中最重要的是一致性.

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

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

如果您知道为什么以这种方式使用它们,那么混合这个概念对您来说可能没问题.但是这里出现了破窗理论(由Coding Horror描述的版本).任何访问代码的人都更有可能选择不打算使用这种方式的版本.

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

我已经指导过许多应用程序的团队,这些应用程序$this->container从代码中简单开始,经过几年的最终呼唤我的帮助,如何重写或重构整个静态地狱.

  • 很好,但是使用'%kernel.debug%'代替'%kernel.environment%'和`bool $ isDebug`作为构造函数的参数。 (3认同)

Luk*_*ing 5

Symfony 5.1

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

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