29

我正在使用 symfony 2,我们有 2 个配置,dev 和 prod。我需要知道我是否可以找出我在实体或模型中使用的是哪一个。

我正在寻找与 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);
}

我不清楚将这段代码放在哪里。在我看来,它应该放在内核中,如果我有内核,我就不会遇到这个问题。

我的问题是,有没有一种简单的方法可以让我从服务或模型中确定我是在内核中设置的“开发”还是“产品”。谢谢

4

4 回答 4

53

控制台生成的默认实体类不继承任何东西。这意味着它们无论如何都不是“ContainerAware”。

一般来说,我认为他们不应该。我想这取决于你在做什么,但你可以通过一些基本的依赖注入来处理这个

在控制器中:

$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;
}

这对你有用吗?

PS您发布的事件侦听器适用于控制器 - 不适用于任意类。

于 2012-05-17T19:00:45.447 回答
19

也可以将其作为参数获取。如果你看一下这个\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 类

于 2015-04-24T11:26:33.140 回答
3

当然有全局变量的快速而肮脏的方式......

function quickAndDirty() {
   global $kernel;

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

它既坏又邪恶,你应该在使用它后洗干净自己,但在你可能继承的大型现有代码库的情况下,它可以避免潜在的重构噩梦。

当然,使用这种方法后是否可以自己生活,取决于您;)

于 2016-10-04T09:42:22.263 回答
2

(注意:这适用于 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 注入。

于 2019-04-04T21:58:13.577 回答