【Laravel】実装コード上で.envの値はconfig()で取得する
なんかめんどくさい。
config()経由で取得しろって、別にenv()で良いじゃんって思いましたが
config:cacheを実行した環境だとNULLが帰ってくるらしいです。
$ php artisan config:cache
config/*.phpの情報は取得できるのですが、え?それってキャッシュじゃないじゃん。
.envの情報は秘匿され、取得することができません。
隠すなよ。
キャッシュされてるので、.envを変更してもキャッシュの方を読みますならわかる。
解決方法えー、いちいちそんなことすんのと思ったら既にありました。
では、どうすればよいのか。
それは、configディレクトリに新たなファイルを作成し、
そのファイル内でenv()をコールして、
.envの情報をconfigに持たせることです。
これにより、config()で取得することができます。
プロジェクトルートの下のconfigの下にたくさんのPHPファイルがあります。
例えばdatabase.phpの中で
'default' => env('DB_CONNECTION', 'mysql'),
というようにdefautのDBコネクションをenvを使って取得しています。
なので
$default_connection = config('database.default');
とすれば良さそうです。
簡単にソースコードを書いて試してみます。
同じものをenv()とconfig()を使って取得して表示するだけです。
<body class="antialiased"> <p>Test env and config</p> @php $env_value = env('DB_CONNECTION', 'NotFound'); $config_value = config('database.default'); @endphp <h1>DB_CONNECTION(env): {{ $env_value }}</h1> <h1>DB_CONNECTION(config): {{ $config_value }}</h1> </body>
1. キャッシュを実行する前
env()でもconfig()でも同じものを表示します。
【Laravel】開発環境では「php artisan config:cache」をするべきではない
$ php artisan config:cache
INFO Configuration cached successfully.
が生成されて中に設定が格納されています。
キャッシュ実行後の\bootstrap\cach |
そしてこの状態でenvでデータを取得しようとするとキーが見つかりませんね。
config経由だと問題ありません。
でこの状態で.envの値を修正してもキャッシュには反映されないと。
DB_CONNECTION=Production2
なので、この状態では2択
- php artisan config:cacheを実行してキャッシュに.envの内容を反映させる。
- php artisan config:clearを実行してキャッシュを消して.envの方をみるようにする。
順にやってみます。
1.もう一度キャッシュコマンドを実行する
$ php artisan config:cache
INFO Configuration cached successfully.
想定通り、修正した.envの内容を表示していますね(キャッシュに反映している)。
2.キャッシュを消す
.envの内容を再度変更して
DB_CONNECTION=Production3
キャッシュを消す
$ php artisan config:clear
INFO Configuration cache cleared successfully.
想定通り.envの内容を表示していますね。
キャッシュが消えたのでenv()でも問題なく表示できています。
ということで今回のまとめとしては
- .envの設定を参照する場合はconfig()を使う
- 開発環境でキャッシュコマンドは実行しない
- 本番環境でキャッシュコマンドを実行すべき。ただ実行忘れを防止するためにデプロイ時に自動的に実行するような仕組みにしておくと良い。
くらいですかね。以下のサイトが良くまとまっています。
【Laravel】.envとphp artisan config:cacheを正しく理解する
0 件のコメント:
コメントを投稿