首页 文章

访问symfony 2中的AppKernel环境变量

提问于
浏览
23

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

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

$this->getEnvironment()

如果我可以加载内核来调用它会很好但我可以知道如何或在哪里捕获这些事件,以便我可以在它们上调用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);
}

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

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

4 回答

  • 2

    控制台生成的默认实体类不会继承任何内容 . 这意味着它们不是任何“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;
    }
    

    这对你有用吗?

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

  • 0

    也可以将其作为参数 . 如果你看一下 \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');
    

    see Kernel.php class on github

  • 19

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

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

    它的坏与坏,你应该在使用它之后自己洗,但是如果你可能继承了大量的现有代码库,它可以节省潜在的重构噩梦 .

    当然,使用这种方法后你是否可以忍受自己,取决于你;)

  • 47

    (注意:这适用于Symfony 3.x,不确定4.x)

    您可以直接将_2988229注入您的服务:

    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注入 .

相关问题