访问symfony 2中的AppKernel环境变量

Con*_*tch 27 php configuration symfony

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

我正在寻找与AppKernel.php中的代码类似的东西:

$this->getEnvironment()
Run Code Online (Sandbox Code Playgroud)

如果我可以加载内核来调用它会很好但我找不到办法来做到这一点.看一下这看起来似乎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);
}
Run Code Online (Sandbox Code Playgroud)

我不清楚在哪里放这个代码块.在我看来,它应该进入内核,如果我有内核,我不会遇到这个问题.

我的问题是,是否有一种简单的方法可以确定我是从服务还是模型中的内核中设置的'dev'或'prod'.谢谢

Pet*_*ley 51

控制台生成的默认实体类不会继承任何内容.这意味着它们不是任何"ContainerAware".

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

在控制器中:

$entity = new \Your\Bundle\Entity\Foo(
  $this->container->get( 'kernel' )->getEnvironment()
);
Run Code Online (Sandbox Code Playgroud)

然后在src/Your/Bundle/Entity/Foo.php中

private $env;

public function __construct( $env=null )
{
  $this->env = $env;
}
Run Code Online (Sandbox Code Playgroud)

这对你有用吗?

PS您发布的事件监听器是针对控制器的 - 而不是针对任意类.


Fra*_*ula 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()
    );
}
Run Code Online (Sandbox Code Playgroud)

因此,在services.yml文件中,您可以通过%kernel.environment%容器识别类获取环境,您可以通过执行以下操作来获取环境:

$this->getContainer()->getParameter('kernel.environment');
Run Code Online (Sandbox Code Playgroud)

请参阅github上的Kernel.php类