Laravel为什么不能在程序中直接使用env函数
一定要爱着点什么,恰似草木对光阴的钟情。
HH
env()
は コントローラー, モデル, etc.. 内で直接使わない。config/*.php
にenv()
の値を入れてconfig()
から参照する。
例
1 |
|
1 |
|
何故 env() を使ってはいけないのか
本番環境でconfig:cache
コマンドを実行した際、.env
ファイルを読み込まないから。
.env
ファイルはIlluminate\Foundation\Bootstrap\LoadEnvironmentVariables
クラスのbootstrap()
で読み込まれるのですが、読み込む前にconfig
のキャッシュの有無を確認し、キャッシュがあった場合は.env
ファイルを読み込まない仕様になっています。
当該部分のLaravelのコードを引用。
1 |
|
大体の場合の本番環境では、高速化の為に設定を一纏めにするconfig:cache
コマンドを実行すると思うのですが、前述の通りキャッシュがあると.envが読み込まれないので、env()
を直接叩いてると開発時やテスト時には動くけど本番環境で死ぬ。といった事になります。(実際なった)
実際に試す
適当なコントローラーを用意してddを使って値をダンプするだけ。
1 |
|
まずはキャッシュ無しでアクセス。
1 | "Foo" |
テスト環境や開発環境と同じ様にキャッシュを作成していないのでどちらも同じ値が取得できます。
次にキャッシュさせてアクセス。artisan
のconfig:cache
を実行してbootstrap/cache/config.php
を作成します。
1 | php artisan config:cache |
で、先ほどと同じ様にアクセスしてみる。
1 | null |
.env
ファイルが読み出されていないのでenv()
で取得した所で値が入ってる訳もなくnullを返します。
と言う訳で最初に書いた通り、env()は直接使わずにconfig()に.envの値を入れて使いましょう。