2012-05-17 50 views
21

我使用symfony 2,我們有2個配置,dev和prod。我需要知道我是否可以找出在實體或模型中使用哪一個。訪問symfony 2中的AppKernel環境變量

我在尋找類似下面的代碼在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); 
} 

它對我不清楚在哪裏把這塊代碼。在我看來,它應該進入內核,如果我有內核,我不會有這個問題。

我的問題是,是否有一種簡單的方法可以確定我是否處於內核中從服務或模型中設置的'dev'或'prod'。 謝謝

回答

44

由控制檯生成的默認實體類不會繼承任何東西。這意味着它們不是以任何方式「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; 
} 
請問

這對你的工作?

P.S.您發佈的事件監聽器用於控制器 - 不適用於任意類。

+0

是的,謝謝你,一點也將帶着幾分重構 – ContextSwitch

+0

我使用的Symfony 2.6很好地工作我必須這樣做:$ kernel = $ this-> container-> get('kernel'); – Dominick

18

也可以將它作爲參數。如果你看一下\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

+0

我會建議調用'parent :: getKernelParameters()'方法以確保在symfony的下一個發行版中添加一個參數時不會忘記任何參數:) 'return array_merge(parent :: getKernelParameters() ,array(...));' –

3

當然有快和全局的骯髒的方式...

function quickAndDirty() { 
    global $kernel; 

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

它的壞的,邪惡的,並用它之後,你應該洗自己,但你也許繼承了一大筆現有的代碼庫的情況下,節省了潛在的重構噩夢。

當然,您是否可以使用該方法後,用自己的生活,是由你;)