13

PHP用のdotenvを使用して環境設定を管理しています(lavarelではありませんが、lavarelもdotenvを使用しているためタグを付けました)

コードベースから .env を除外し、他のすべての協力者のために .env.example を追加しました

dotenv の github ページ:

phpdotenv は開発環境用に作成されており、通常は本番環境では使用しないでください。本番環境では、要求ごとに .env ファイルをロードするオーバーヘッドがないように、実際の環境変数を設定する必要があります。これは、Vagrant、chef、Puppet などのツールを使用した自動デプロイ プロセスによって実現できます。また、Pagodabox や Heroku などのクラウド ホストを使用して手動で設定することもできます。

私が理解していないのは、次の例外が発生することです。

PHP Fatal error: Uncaught exception 'InvalidArgumentException' with message 'Dotenv: Environment file .env not found or not readable.

これは、「リクエストごとに .env ファイルをロードするオーバーヘッドがないように、実際の環境変数を設定する必要がある」というドキュメントと矛盾しています。

したがって、問題は、dotenv がその例外をスローする理由があるかどうか、および/または何かが足りないかどうかです。まず他のdotenvライブラリ(ruby)と比べて挙動が違う

私はこれを簡単に回避できますが、あまり良い解決策ではありません:

if(getenv('APPLICATION_ENV') !== 'production') { /* or staging */
    $dotenv = new Dotenv\Dotenv(__DIR__);
    $dotenv->load();
}

私の意見では最も良い解決策ですが、 dotenv がこれを処理する必要があると思います。

$dotenv = new Dotenv\Dotenv(__DIR__);
//Check if file exists the same way as dotenv does it
//See classes DotEnv\DotEnv and DotEnv\Loader
//$filePath = $dotenv->getFilePath(__DIR__); 
//This method is protected so extract code from method (see below)

$filePath = rtrim(__DIR__, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR . '.env';
//both calls are cached so (almost) no performance loss
if(is_file($filePath) && is_readable($filePath)) {
    $dotenv->load();
}
4

3 に答える 3

3

APP_ENV 変数の作成に問題がある場合は、次のコードの方が簡単です。

$dotenv = new Dotenv\Dotenv(__DIR__);
if(file_exists(".env")) {
    $dotenv->load();
}
于 2016-04-18T20:47:15.373 に答える
1

これも調べましたが、私の現在の解決策は、ディスカッションで提案されたルーメンの方法(2016 年 6 月 6 日現在) を使用することです。

try {
    (new Dotenv\Dotenv(__DIR__.'/../'))->load();
} catch (Dotenv\Exception\InvalidPathException $e) {
    //
}

必要に応じて、追加の例外処理を行うことができます (たとえば、デフォルト値に落ちるか、何らかの検証を行います。

于 2016-06-06T13:48:26.510 に答える