【Laravel】.envの項目をenvやgetenv関数で取得できない場合の対策

こんにちは。Laravelのenvに項目を追加したけどプログラムの中で参照できない。という問題が発生し、結構ハマったので情報共有します。php artisan cache:configなどを一通り試したけど解決できないという場合に参考になるかもしれません。

原因:php artisan config:cachで設定ファイルをキャッシュしているから

php artisan config:cacheを行うことでconfigフォルダ配下の設定ファイル群を1ファイル(bootstrap/cache/config.php)にまとめ、laravelのロードを高速化することができます。非常に便利なコマンドですが、このコマンドを実行するとenv()やgetenv()の実行結果が必ずNULLになるという仕様がLaravelにはあります。これを知らずにプログラムから直接envを参照するとnullしか返さずにかなりハマります。

解決策:configを介して.envを参照する

.envに設定を追加した場合、configファイルを介して.envを参照することで解決することができます。configで.envを読み込み、プログラムからはconfigを参照するようにします。configファイルの中でenv()を記述すると、config:cacheコマンド実行時にenv()関数が評価され、.envの設定値を取得します。試しにSAMPLEという設定値を追加してみます。

まずは.envファイルに項目を追加します。

SAMPLE=foo

この状態で一度php artisan config:cacheを実行し、tinkerで直接env()を使用して参照してみます。

>>> env('SAMPLE');
=> null

configがキャッシュされているため、直接envを参照するとnullが返されます。

では次にconfigを介してenvを読み込んでみましょう。configフォルダ配下にsample_config.phpという名前のファイルを作成します。env関数を使用して値を取得するよう記述します。

<?php

return [
    'sample' => env('SAMPLE', 'bar'),
]

?>

tinkerでconfigメソッドを使用してみます。

>>> config('sample_config.sample');
=> "foo"

.envに設定した値を取得することができました!

確認のためキャッシュされたconfigファイルを確認してみます。

  'sample_config' => 
  array (
    'sample' => 'sample',
  ),

このような感じで追加したconfigがキャッシュされていました。

まとめ

今回は.envを参照する際にconfig:cacheされているとenv関数を使用することができなくなるという問題を解説しました。envを参照するときは常にconfigを介してアクセスすれば問題は解決しますので、そのようなルールで運用するのがベストだと個人的には思います。

Laravel

Posted by kobainmac