检查是否在“开发”模式Symfony2.x一个控制器内(Check if in “dev” mode

2019-07-01 13:43发布

当使用开发模式与Symfony2.x应用,人们通常工作在现场。 因此,这样的功能确实如预期(例如,尝试获得当前IP下本地主机)不工作。 这可能是一个问题,例如,当一个尝试使用这种基于IP的网络服务。 因此, 我只是想知道如何检查控制器内,如果Symfony2的应用程序在开发模式下运行与否 。 通过这种方式可以根据设定通过模式控制器的行为。

任何的想法?

Answer 1:

为了获得在当前的环境下Controller你可以使用:

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

所以,你只要把在一个if()语句来检查它是否等于dev



Answer 2:

由于Symfony的2.5这是可以做到的:

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

直接问它的环境的内核看上去比搜索参数更好。



Answer 3:

既然你想知道,如果你是在开发模式(不necessarilly命名为“开发”环境),你可以从服务容器中的内核,并检查isDebug方法的返回:

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

正如指出的文档中 (重点是我的),

重要的,但无关的环境的话题就是truefalse参数作为第二个参数AppKernel构造。 这个规定,如果申请应以“调试模式”运行。 在任何环境下,一个Symfony的应用程序可以设置为true或false调试模式下运行 。 这会影响在应用中有许多东西,比如显示错误页面,或者缓存文件是动态重建对每个请求踪迹。 虽然不是必需,调试模式通常被设置为true的开发和测试环境,并为虚假督促环境。

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



Answer 4:

这里是2017年使用构造器注入 的Symfony 3.3+版本。

相反,通过你的整个应用程序(=容器),你可以只传递你所需要的参数

1.服务配置

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

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

如果你不明白这句法, 检查此文章,解释的Symfony迪讯在之前/之后的例子 。

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


为什么要避免将集装箱控制器?

在代码中最重要的事情是一致性

  • 如果你喜欢静,服务定位器(=服务,您可以通过随时随地得到任何其他服务),使用它。

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

混合这个概念可能是好的给你,如果你知道为什么你用他们的方式。 但是来这边玩的破窗理论(由编码恐怖很好的描述版本) 。 任何人来到代码将更有可能选择那些不打算使用这种方式的版本

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

我指导的许多应用团队,与简单的开始$this->container中的代码和之后几年结束了给我打电话求救,如何改写或重构整个静态地狱。



文章来源: Check if in “dev” mode inside a Controller with Symfony2.x