本番で config:cache を実行したあと、ある機能が動かなくなり、調べたら env() が null を返していました。なぜですか。
設定が1つのファイルにまとめられ、以降 .env が読み込まれなくなるからです。公式も「キャッシュ後は .env が読まれない」と明記しています。config() 経由なら影響を受けません。
面接官が見ているのは定番の事故。踏んだ経験があるかが出る。
これは「環境ごとに違う設定値の扱い方として正しいのはどれですか。」への追撃質問です。
よくある答えと、面談でどう見られるか
- config:cache 後は .env が読まれなくなり、env() がシステム環境変数しか返さなくなるため
正解です。修正は、その値を config/ に定義して config() 経由で読むこと。「env() は config/ の中でしか使わない」が原則です。 - .env ファイルの権限が足りずに読めなくなったから
権限ではありません。そもそも読みに行かなくなります。 - config:cache が .env を削除するから
削除はしません。参照しなくなるだけです。 - キャッシュが壊れているので config:clear すれば直る
一時的には直りますが、次に config:cache すると再発します。根本原因は env() の呼び出し場所です。
面接官は何を見ているか
- config キャッシュ後は .env が読まれなくなると説明できた
- config/ 以外で env() を呼んでいたのが原因だと特定できた
- config に定義して config() 経由で読む、という修正を言えた
模範解答
config:cache を実行すると設定が1つのファイルにまとめられ、以降 .env は読み込まれなくなります。
公式ドキュメントの記載はこうです。 「設定がキャッシュされると .env はリクエストや Artisan コマンドの際に読み込まれない。 したがって env 関数は外部のシステムレベル環境変数しか返さなくなる」
つまり厳密には「null になる」のではなく「.env を見なくなる」。サーバーに同名の環境変数が無ければ、結果として null が返ります。
config/ の中の env() はキャッシュ生成時に評価済みなので問題ありません。壊れるのはコントローラやサービスクラスで直接 env() を呼んでいる箇所です。修正は、その値を config/ に定義して config() 経由で読むようにすること。「env() は config/ の中でしか使わない」が原則です。