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();
}
Dotenvは、開発環境でのみ使用されるという考えに基づいて構築されました。したがって、常に.env
存在するファイル。
あなたが気に入らなかった解決策は、Dotenvを使用するための推奨される方法です。そして、それは 近い将来変更されない のようです。プロジェクトの課題追跡での関連ディスカッション: https://github.com/vlucas/phpdotenv/issues/63#issuecomment-7456188
Mark offers は、ファイルの読み込みをスキップするが検証は行わない、本番環境/ステージング環境に適したアプローチがあることに注意してください。
$dotenv = new Dotenv\Dotenv();
if(getenv('APP_ENV') === 'development') {
$dotenv->load(__DIR__);
}
$dotenv->required('OTHER_VAR');
APP_ENV変数の作成に問題がある場合、このコードは簡単です。
$dotenv = new Dotenv\Dotenv(__DIR__);
if(file_exists(".env")) {
$dotenv->load();
}
これについても調べましたが、現在の解決策は ルーメンの方法 (2016年6月6日現在)を使用することです ディスカッションで提案 :
try {
(new Dotenv\Dotenv(__DIR__.'/../'))->load();
} catch (Dotenv\Exception\InvalidPathException $e) {
//
}
必要に応じて、追加の例外処理を行うこともできます(たとえば、デフォルト値に下げるか、検証を行います)。