web-dev-qa-db-ja.com

Laravel 5でENV変数を設定する正しい方法は何ですか?

laravel 4で:

$env = $app->detectEnvironment(array(
    'local' => array('Homestead')
));

デフォルトで。

ただし、laravel 5では、次のように変更されます。

$env = $app->detectEnvironment(function()
{
    return getenv('APP_ENV') ?: 'production';
});

また、.gitignoreの。env。*行を除外しました。

.env

そして、ファイル.env.exampleを追加しました:

APP_ENV=local
APP_KEY=SomeRandomString
DB_USERNAME=Homestead
DB_PASSWORD=Homestead

したがって、2つ以上の環境がある場合、それらをすべて単一の.envファイルに設定する必要がありますか?例えば。:

APP_ENV=local
DB_PASSWORD=123

APP_ENV=alpha
DB_PASSWORD=456

.envファイルがない場合、laravelはどの環境を使用しているかを知ることができますか?

29
Alexander Kim

Laravel 4:と同じように行うことができます。

$env = $app->detectEnvironment(array(
    'local' => array('Homestead')
));

*.envファイルは、VCSに入れるべきではない機密データを入れるためにのみ使用されます。同じことはLaravel 4

しかし、最後の日にデフォルトのdetectEnvironmentが次のように変更されたようです:

$env = $app->detectEnvironment(function()
{
    return getenv('APP_ENV') ?: 'production';
});

そのため、PC名またはENVファイルから設定変数を使用できます。

メインenvファイルでENVベースの環境検出を使用する場合(デフォルトでは.envファイルを追加する必要があります:

APP_ENV=local

もちろんlocalはローカル環境です。これをproductionまたはdevに変更できます

現時点で私が見る最も重要な問題は、この.envファイルの内容をAPP_ENV=localからAPP_ENV=productionに変更するために本番に行くときに覚えておく必要があるということです。 PC名に基づく古いデフォルトの方法。

現在、ENVファイル。 ENVベースの環境検出を使用する場合は、ENVファイルのみに含める必要があります。

APP_ENV=local

これで、たとえば、さまざまな環境用に個別のENVファイルを作成できます。

。local.env

 MY_DB=testdb

。production.env

MY_DB=productiondb

そして今bootstrap.environment.phpファイルで変更できます:

if (file_exists(__DIR__.'/../.env'))
{
    Dotenv::load(__DIR__.'/../');
}

に:

if (file_exists(__DIR__.'/../.env'))
{
    Dotenv::load(__DIR__.'/../');

    if (getenv('APP_ENV') && file_exists(__DIR__.'/../.' .getenv('APP_ENV') .'.env')) {
        Dotenv::load(__DIR__ . '/../', '.' . getenv('APP_ENV') . '.env');
    }   
}

メインenvファイルからAPP_ENVに基づいて追加のenvファイルをロードします。

これで、他の構成ファイルでいつものように使用できます:$_ENV['MY_DB']

30

5.2にアップグレードしたばかりの場合:

静的Dotenv::load()メソッドを使用することはできなくなりました。代わりに次を使用してください。

$dotenv = new Dotenv\Dotenv(__DIR__ . '/../', '.' . getenv('APP_ENV') . '.env'); // Laravel 5.2
$dotenv->load();

bootstrap/app.phpで。

// Sooを編集します。過去1時間これを掘り下げた後、ここに追加情報を追加することもできます。

  • Laravelは設定に.envファイルを使用します
  • デフォルトでは、アプリケーションのルートディレクトリにある「.env」ファイルがロードされます
  • これらの.envファイル内の値には、env()ヘルパー関数を介して、またはPHPのネイティブgetenv()関数を介して直接アクセスできます。 これらはキャッシュ可能 であるため、設定ファイル(/config/*.phpを参照)を満たすためにのみ行うべきです。
  • .envファイルは DetectEnvironment クラスにロードされます。デバッグ中にブレークポイントを設定するのに役立つことがわかりました。行(new Dotenv($app->environmentPath(), $app->environmentFile()))->load();に注意してください: load()を使用しているため、すでに設定されている環境値は上書きされません!(そうするためにoverload()を使用する必要があります-これは私を運転しましたナッツ Homesteadがphp-fpm構成APP_ENV/etc/php/7.0/fpm/php-fpm.conf変数をlocalに設定するため.envファイルで変更することはできません)
  • 単体テストを作成するとき、通常、 TestCase から継承します。これはAPP_ENV変数をテストに設定します( refreshApplication() -を使用してputenv()はデフォルトのlocal値を上書きします)
12
Hirnhamster

私はLaravel 5.1、これはわずかに単純な私見です。bootstrap/ app.phpでは、アプリケーションがインスタンス化された直後に)にソリューションを提供したかっただけです。

$app->beforeBootstrapping(\Illuminate\Foundation\Bootstrap\DetectEnvironment::class, function() use ($app) {
    $suffix = (env('APP_ENV')) 
        ? '.'.env('APP_ENV') 
        : '';
    $app->loadEnvironmentFrom('.env'.$suffix);
});

チェックやエラー処理は必要ありません。 Laravelは、ファイルが見つからない場合、デフォルトで「プロダクション」になります。

以上です。

1
thefuzzy0ne

デフォルトで複数の.envファイルを持つことはできないという事実andは.gitignoreで除外されているため、意図的に環境を管理する方法です。 .envファイルはバージョン管理内になく、環境ごとに構成する必要があります。 .envは、環境とすべての環境変数を設定します。

したがって、2つ以上の環境がある場合、それらをすべて単一の.envファイルに設定する必要がありますか?

いいえ。アプリケーションをインストールした各場所に.envファイルがあります。違いは、そのファイルの中にあるものです。

さらに、.envファイルは単にキーと値のストアであるため、後続の宣言は以前の宣言を上書きします。あなたの例では、Laravelはあなたの「ローカル」設定を見ることはないでしょう。

最初は奇妙に思えますが、この新しいデフォルトシステムは実際には一般に簡単であり、論理エラーの場所がないため、「4.2の方法」にあった問題が発生しにくくなります。

.envファイルがない場合、laravelはどの環境を使用しているかを知ることができますか?

まったく実行されません。 .envファイルではAPP_KEY宣言もLaravelなしでは実行されません。.envファイルがなければ、500サーバーエラーが発生します。 。

0
Shauna