42

Symfony2.xアプリケーションで開発モードを使用する場合、通常はロケールで動作します。したがって、そのような関数は期待どおりに機能しません (たとえば、localhost で現在の IP を取得しようとするなど)。これは、たとえば、そのような IP ベースの Web サービスを使用しようとした場合などに問題になる可能性があります。したがって、Symfony2アプリケーションが開発モードで実行されているかどうかをコントローラー内で確認する方法を知りたいだけです。このようにして、モードに応じてコントローラーの動作を設定できます。

何か案が?

4

9 に答える 9

61

現在の環境を取得するには、Controller次を使用できます。

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

したがって、それをステートメントに入れて、if()と等しいかどうかを確認しdevます。

于 2012-10-21T13:13:16.007 に答える
27

Symfony 2.5では、次のように実行できます。

$this->container->get('kernel')->getEnvironment();

パラメータを検索するよりも、カーネルに環境を直接尋ねる方が見栄えがします。

于 2015-04-24T10:42:21.363 に答える
18

Symfony 3.3/4/5+ ソリューション

これは2017 およびConstructor Injectionを使用したSymfony 3.3+バージョンです。

アプリケーション全体 (= コンテナー) を渡す代わりに、必要なパラメーターのみを渡すことができます。

1. サービス構成

# app/config/services.yml
services:
    _defaults:
        autowire: true

    App\Controller\SomeController:
        arguments: ['%kernel.environment%']

この構文を理解していない場合は、Symfony DI ニュースの前/後の例を説明しているこの投稿を確認してください

2. コントローラー

namespace App\Controller;

final class SomeController
{
    /**
     * @var string
     */
    private $environment;

    public function __construct(string $environment)
    {
        $this->environment = $environment;
    }

    public function someAction()
    {
        $this->environment...
        // any operations you need
    }
}


コントローラーでコンテナーを渡さないようにするのはなぜですか?

コードで最も重要なことは一貫性です。

  • 静的ロケーターとサービス ロケーター (= どこでも渡して他のサービスを取得できるサービス) を使用する場合は、それを使用してください。

  • コンストラクター注入、ツリー依存関係グラフ (!= 循環依存関係) を好む場合は、それを使用してください。

なぜそのように使用したかがわかっている場合は、この概念を混在させても問題ないかもしれません。しかし、ここでThe Broken Window Theory (Coding Horror による適切に説明されたバージョン)が再生されます。コードにアクセスする人は、そのように使用することを意図していないバージョンを選択する可能性が高くなります

コードのあいまいさは、レガシー コードへの最初の誘いです

私は多くのアプリケーションのチームを指導してきましたが、それらは単純な$this->containerコードから始まり、数年後、静的な地獄全体を書き直したりリファクタリングしたりする方法について、私に助けを求めるようになりました。

于 2017-10-24T13:03:37.023 に答える