访问AppKernel环境变量中的symfony 2(Accessing the AppKernel

2019-07-29 10:40发布

我使用的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);
}

它不清楚我在哪里把这个代码块。 在我看来,它应该在的内核,如果我有我的内核将不会有这个问题。

我的问题是,有没有为我确定,如果我在“开发”或在内核设置,从服务或模式“督促”是一个简单的方法。 谢谢

Answer 1:

由控制台生成的默认实体类不继承任何东西。 这意味着它们不以任何方式“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你张贴了关于该事件侦听器是控制器-不是任意的类。



Answer 2:

它也有可能得到,作为一个参数。 如果你看看在\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类



Answer 3:

当然也有全局的快速和肮脏的方式...

function quickAndDirty() {
   global $kernel;

   if ($kernel->getEnvironment() == 'dev') {
      // we're in dev mode
   }
}

它的坏的和邪恶,使用后应洗净自己,但你也许继承了一大笔现有的代码库的情况下,节省了潜在的重构噩梦。

当然,您是否可以使用该方法后,用自己的生活,是你;)



Answer 4:

(注:这个工程上的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注入。



文章来源: Accessing the AppKernel environment variable in symfony 2