访问 symfony 2 中的 AppKernel 环境变量


Accessing the AppKernel environment variable in symfony 2

我正在使用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
        }
    }
}

这样做的好处是,如果要进行单元测试,则不需要容器。

如果你不喜欢属性注入,你可以使用构造函数或资源库注入。