当使用开发模式与Symfony2.x应用,人们通常工作在现场。 因此,这样的功能确实如预期(例如,尝试获得当前IP下本地主机)不工作。 这可能是一个问题,例如,当一个尝试使用这种基于IP的网络服务。 因此, 我只是想知道如何检查控制器内,如果Symfony2的应用程序在开发模式下运行与否 。 通过这种方式可以根据设定通过模式控制器的行为。
任何的想法?
当使用开发模式与Symfony2.x应用,人们通常工作在现场。 因此,这样的功能确实如预期(例如,尝试获得当前IP下本地主机)不工作。 这可能是一个问题,例如,当一个尝试使用这种基于IP的网络服务。 因此, 我只是想知道如何检查控制器内,如果Symfony2的应用程序在开发模式下运行与否 。 通过这种方式可以根据设定通过模式控制器的行为。
任何的想法?
为了获得在当前的环境下Controller
你可以使用:
$this->container->getParameter('kernel.environment');
所以,你只要把在一个if()
语句来检查它是否等于dev
。
由于Symfony的2.5这是可以做到的:
$this->container->get('kernel')->getEnvironment();
直接问它的环境的内核看上去比搜索参数更好。
既然你想知道,如果你是在开发模式(不necessarilly命名为“开发”环境),你可以从服务容器中的内核,并检查isDebug
方法的返回:
$kernel = $this->get('kernel');
$devMode = $kernel->isDebug();
正如指出的文档中 (重点是我的),
重要的,但无关的环境的话题就是
true
或false
参数作为第二个参数AppKernel
构造。 这个规定,如果申请应以“调试模式”运行。 在任何环境下,一个Symfony的应用程序可以设置为true或false调试模式下运行 。 这会影响在应用中有许多东西,比如显示错误页面,或者缓存文件是动态重建对每个请求踪迹。 虽然不是必需,调试模式通常被设置为true的开发和测试环境,并为虚假督促环境。在内部,调试模式的值变为所述服务容器内部使用的kernel.debug参数。
这里是2017年使用构造器注入 的Symfony 3.3+版本。
相反,通过你的整个应用程序(=容器),你可以只传递你所需要的参数 :
# app/config/services.yml
services:
_defaults:
autowire: true
App\Controller\SomeController:
arguments: ['%kernel.environment%']
如果你不明白这句法, 检查此文章,解释的Symfony迪讯在之前/之后的例子 。
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
中的代码和之后几年结束了给我打电话求救,如何改写或重构整个静态地狱。