我使用的symfony 2,我们有两种配置,开发和生产线。 我需要知道,如果我能找出使用实体或模型中哪一个IM。
我在寻找类似下面的代码在AppKernel.php发现了一些:
$this->getEnvironment()
如果我能装载内核来调用这个,这将是伟大的,但我无法找到一个方法来做到这一点。 寻找到这之后似乎symfony的事件可能会返回内核,但我不知道如何或在哪里捕获这些事件,这样我可以呼吁他们getKernel()。 http://symfony.com/doc/current/book/internals.html
例如,他们列出这个例子:
使用的Symfony \分量\ HttpKernel \事件\ FilterControllerEvent;
public function onKernelController(FilterControllerEvent $event)
{
$controller = $event->getController();
// ...
// the controller can be changed to any PHP callable
$event->setController($controller);
}
它不清楚我在哪里把这个代码块。 在我看来,它应该在的内核,如果我有我的内核将不会有这个问题。
我的问题是,有没有为我确定,如果我在“开发”或在内核设置,从服务或模式“督促”是一个简单的方法。 谢谢
由控制台生成的默认实体类不继承任何东西。 这意味着它们不以任何方式“ContainerAware”。
而一般来说,我不认为他们应该是。 我认为这取决于你在做什么,但你可以做一些基本的依赖注入处理这
在一个控制器:
$entity = new \Your\Bundle\Entity\Foo(
$this->container->get( 'kernel' )->getEnvironment()
);
然后在SRC /你/包/实体/ Foo.php
private $env;
public function __construct( $env=null )
{
$this->env = $env;
}
这会为你工作?
PS你张贴了关于该事件侦听器是控制器-不是任意的类。
它也有可能得到,作为一个参数。 如果你看看在\Symfony\Component\HttpKernel\Kernel
类,你会发现一个getKernelParameters()
方法暴露所有的内核参数。
/**
* Returns the kernel parameters.
*
* @return array An array of kernel parameters
*/
protected function getKernelParameters()
{
$bundles = array();
foreach ($this->bundles as $name => $bundle) {
$bundles[$name] = get_class($bundle);
}
return array_merge(
array(
'kernel.root_dir' => realpath($this->rootDir) ?: $this->rootDir,
'kernel.environment' => $this->environment,
'kernel.debug' => $this->debug,
'kernel.name' => $this->name,
'kernel.cache_dir' => realpath($this->getCacheDir()) ?: $this->getCacheDir(),
'kernel.logs_dir' => realpath($this->getLogDir()) ?: $this->getLogDir(),
'kernel.bundles' => $bundles,
'kernel.charset' => $this->getCharset(),
'kernel.container_class' => $this->getContainerClass(),
),
$this->getEnvParameters()
);
}
因此,在一个services.yml
文件,你可以得到与环境%kernel.environment%
而在容器识别类,你可以通过做得到它:
$this->getContainer()->getParameter('kernel.environment');
在Github上查看Kernel.php类
当然也有全局的快速和肮脏的方式...
function quickAndDirty() {
global $kernel;
if ($kernel->getEnvironment() == 'dev') {
// we're in dev mode
}
}
它的坏的和邪恶,使用后应洗净自己,但你也许继承了一大笔现有的代码库的情况下,节省了潜在的重构噩梦。
当然,您是否可以使用该方法后,用自己的生活,是你;)
(注:这个工程上的Symfony 3.x中,不知道4.x版)
你可以注入%kernel.environment%
直入你的服务:
my_service:
class: My\Foo
properties:
env: '%kernel.environment%'
然后在您的服务类:
class Foo {
$env;
...
function someFunction()
{
if($this->env === 'dev') {
// do some dev stuff
}
else {
// do some prod stuff
}
}
}
这样做的好处是,如果你是单元测试,你并不需要的容器。
如果你不喜欢属性注入时,可以使用构造函数或setter注入。