Edited at

Laravelのenv関数で値が取得できない原因と対策


前置き

なんか実行環境が変わったらenv関数で値が取得できてないっぽいんだけど?みたいな経験ありませんか?この問題の原因と解決方法をまとめて見たいと思いますです。


まずはenv関数の紹介

Laravel5では環境依存するような値は環境変数として.envファイルに記述しますが、コード上からそれらの変数を参照する場合はenv関数を使います。実際にこのenv関数を使っている箇所として、config/app.phpがありますので、見てみましょう。


config/app.php


return [
'name' => env('APP_NAME', 'Laravel'),
'env' => env('APP_ENV', 'production'),
];

env関数の第2引数はデフォルト値です。上記の例ですと、APP_NAMEという環境変数が.envに設定されていない場合、env関数は'Laravel'という値を返します。


本題「env関数で値が取得できない」理由

.envファイルに環境変数が設定されているにも関わらず、env関数がnullを返す場合があります。それは、設定ファイルがキャッシュされている場合です。「設定ファイルがキャッシュされると、.envファイルはロードされなくなり、env関数の呼び出しは全てnullを返す」仕様らしいです。参考はこちら。


/// 前提:.envにAPP_NAME=laravelを設定している

/// 設定ファイルがキャッシュされていない場合
echo env('APP_NAME'); /// laravelと出力
echo env('APP_NAME', 'ほげほげ'); /// laravelと出力

/// 設定ファイルがキャッシュされている場合
echo env('APP_NAME'); /// nullなので何も出力されない
echo env('APP_NAME', 'ほげほげ'); /// 第2引数のほげほげが出力される


対策など

手っ取り早い解決としては設定ファイルのキャッシュを消せば直ります。消すのは以下のコマンドです。

php artisan config:clear

ちなみに設定ファイルをキャッシュするのは以下のコマンドです。

php artisan config:cache

一般的に設定ファイルはキャッシュしておいた方が無難なはずです。本番環境などでは当然のようにキャッシュしておくかと思います。ただし、コード上でenv関数を使っていたりすると、設定ファイルをキャッシュした途端に動かなくなるといった現象が起ります。こうした事態を避けるため、上記の例としてあがっているconfig/app.phpでやっているように、config/*.phpに環境変数の値を入れて、コード上ではenv関数ではなくconfig関数を使うようにしたほうが良いようです。