我正在使用symfony 2,我们有2种配置,dev和prod。我需要知道我是否可以找出在实体或模型中使用哪个 im。
我正在寻找类似于 AppKernel 中发现的以下代码的内容.php:
$this->getEnvironment()
如果我可以加载内核来调用它,那就太好了,但我找不到一种方法来做到这一点。在研究之后,似乎symfony事件可能会返回内核,但我不知道如何或在哪里捕获这些事件,以便我可以在它们上调用getKernel((。http://symfony.com/doc/current/book/internals.html
例如,他们列出了以下示例:
使用 Symfony''Component''HttpKernel''Event''FilterControllerEvent;
public function onKernelController(FilterControllerEvent $event)
{
$controller = $event->getController();
// ...
// the controller can be changed to any PHP callable
$event->setController($controller);
}
我不清楚把这段代码放在哪里。在我看来,它应该进入内核,如果我有内核,我就不会有这个问题。
我的问题是,有没有一种简单的方法可以确定我是否处于内核中设置的"开发"或"生产"中,来自服务或模型。谢谢
控制台生成的默认实体类不继承任何内容。 这意味着它们不会以任何方式"感知容器"。
一般来说,我认为他们不应该。 我想这取决于你在做什么,但你可以通过一些基本的依赖注入来处理这个问题
在控制器中:
$entity = new 'Your'Bundle'Entity'Foo(
$this->container->get( 'kernel' )->getEnvironment()
);
然后在src/Your/Bundle/Entity/Foo中.php
private $env;
public function __construct( $env=null )
{
$this->env = $env;
}
这对你有用吗?
附言您发布的事件侦听器适用于控制器 - 而不是任意类。
也可以将其作为参数获取。如果您查看'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 上的内核.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
}
}
}
这样做的好处是,如果要进行单元测试,则不需要容器。
如果你不喜欢属性注入,你可以使用构造函数或资源库注入。