2012-05-17 10 views
21

私はsymfony 2を使用しています。devとprodという2つの設定があります。どのエンティティがエンティティまたはモデルの内部で使用されているかを調べることができるかどうかを知る必要があります。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」ではありません。

一般に、私は彼らがそうすべきだとは思わない。私はそれはあなたがやっているものに依存はずができますが、コントローラでは、いくつかの基本的な依存性の注入

でこれを扱うことができる:

のsrc /あなた/バンドル/エンティティ/ Foo.phpで
$entity = new \Your\Bundle\Entity\Foo(
    $this->container->get('kernel')->getEnvironment() 
); 

そして、

private $env; 

public function __construct($env=null) 
{ 
    $this->env = $env; 
} 

これは機能しますか?

P.S.あなたが投稿したイベントリスナーは、Controllers用であり、任意のクラス用ではありません。

+0

はい、私はsymfonyの2.6を使用してい – ContextSwitch

+0

をリファクタリングのビットとうまく動作するということが、あなたに感謝$ 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() 
    ); 
} 

だから、コンテナを意識クラスにあなたがやってそれを得ることができながら、あなたは%kernel.environment%と環境を得ることができますservices.ymlファイルに:もちろん

$this->getContainer()->getParameter('kernel.environment'); 

see Kernel.php class on github

+0

symfonyの次のリリースで追加されたパラメータを忘れないように 'parent :: getKernelParameters()'メソッドを呼び出すことをお勧めします:) 'return array_merge(parent :: getKernelParameters() 、array(...)); ' –

3

速いがありますとグローバルな汚い方法...

function quickAndDirty() { 
    global $kernel; 

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

その悪いと悪、あなたはそれを使用した後に自分自身を洗う必要がありますが、あなたはおそらく、継承された大規模な既存のコードベースの場合には、それが潜在的なリファクタリングの悪夢が保存されます。

もちろん

、あなたがこのような方法を使用した後、自分と一緒に暮らすことができるかどうか、あなた次第です;)