IT-Q

本番で 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/ の中でしか使わない」が原則です。