web-dev-qa-db-ja.com

Symfonyのコントローラー内で「開発」モードになっているかどうかを確認します

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

何か案が?

34
JeanValjean

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

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

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

50
tolgap

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

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

カーネルに環境を直接問い合わせることは、パラメーターを検索するよりも見栄えが良いようです。

24
Damaged Organic

開発モード(「dev」という名前の環境ではなく)であるかどうかを知りたいので、サービスコンテナからカーネルを取得し、isDebugメソッドの戻り値を確認できます。

$kernel = $this->get('kernel');
$devMode = $kernel->isDebug();

ドキュメントで (強調は私のものです)、

重要ですが、trueコンストラクターの2番目の引数としてのfalseまたはAppKernel引数は、環境のトピックとは無関係です。 これは、アプリケーションを「デバッグモード」で実行するかどうかを指定します。環境に関係なく、Symfonyアプリケーションは、デバッグモードをtrueまたはfalseに設定して実行できます。これは、エラーページにスタックトレースを表示したり、キャッシュファイルが各リクエストで動的に再構築される場合など、アプリケーションの多くのことに影響します。要件ではありませんが、デバッグモードは通常、開発環境とテスト環境ではtrueに設定され、製品環境ではfalseに設定されます。

内部的には、デバッグモードの値は、サービスコンテナー内で使用されるkernel.debugパラメーターになります。

13
Veve

これは2017とSymfony 3.3 +バージョン(Constructor Injectionを使用)です。

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

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
    }
}


コンテナをControllerに渡さないようにする理由

コードで最も重要なことはconsistencyです。

  • 静的およびサービスロケーター(=他のサービスを取得するためにどこにでも渡すことができるサービス)を好む場合は、それを使用します。

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

なぜこの概念を使用したのかを知っていれば、この概念を混ぜても大丈夫かもしれません。しかし、ここで遊びに来ます The Broken Window Theory(Coding Horrorによる適切に記述されたバージョン) 。コードにアクセスする人は、その方法を使用することを意図していないバージョンを選択する可能性が高くなります

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

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

9
Tomáš Votruba

Symfony 4.x以降の場合

_.env_を使用して環境変数を保存している場合は、単に_$_ENV['name-of-variable']_を使用して、それらにアクセスできます任意のコントローラーで

デフォルトのインストールの場合、_$_ENV["APP_ENV"]_変数が使用可能です。これにより、開発モードになっているかどうかがわかります。


print_r($_ENV);を使用して、使用可能なすべての環境変数を表示します。

[ps-これはSymfony 3.4でも機能します]

0
Niket Pathak