ページビューの合計

2023年2月16日木曜日

Laravel: .envの値はconfig()で取得する

ひとつ前のブログで.envのことを書きました。 
ただググっているとなんかenv()を使っちゃいけないって検索結果にヒットしたので確認しました。
ひとつ前のブログでは思いっきりenv()使って設定値を取得してました。


【Laravel】実装コード上で.envの値はconfig()で取得する

なんかめんどくさい。
config()経由で取得しろって、別にenv()で良いじゃんって思いましたが
config:cacheを実行した環境だとNULLが帰ってくるらしいです。
$ php artisan config:cache

config/*.phpの情報は取得できるのですが、
.envの情報は秘匿され、取得することができません。
え?それってキャッシュじゃないじゃん。
隠すなよ。
キャッシュされてるので、.envを変更してもキャッシュの方を読みますならわかる。

解決方法
では、どうすればよいのか。
それは、configディレクトリに新たなファイルを作成し、
そのファイル内でenv()をコールして、
.envの情報をconfigに持たせることです。

これにより、config()で取得することができます。
えー、いちいちそんなことすんのと思ったら既にありました。
プロジェクトルートの下のconfigの下にたくさんのPHPファイルがあります。

例えばdatabase.phpの中で
'default' => env('DB_CONNECTION', 'mysql'),

というようにdefautのDBコネクションをenvを使って取得しています。

なので
$default_connection = config('database.default');

とすれば良さそうです。

簡単にソースコードを書いて試してみます。

同じものをenv()とconfig()を使って取得して表示するだけです。

    <body class="antialiased">
            <p>Test env and config</p>
            @php
                $env_value = env('DB_CONNECTION', 'NotFound'); 
                $config_value = config('database.default');
            @endphp
            <h1>DB_CONNECTION(env): {{ $env_value }}</h1>
            <h1>DB_CONNECTION(config): {{ $config_value }}</h1>
    </body>

 

1. キャッシュを実行する前

env()でもconfig()でも同じものを表示します。


【Laravel】開発環境では「php artisan config:cache」をするべきではない 

  $ php artisan config:cache

   INFO  Configuration cached successfully.

確かにキャッシュを実行すると
プロジェクトフォルダ\bootstrap\cach\config.php
が生成されて中に設定が格納されています。
 
キャッシュ実行後の\bootstrap\cach


そしてこの状態でenvでデータを取得しようとするとキーが見つかりませんね。
config経由だと問題ありません。


でこの状態で.envの値を修正してもキャッシュには反映されないと。

DB_CONNECTION=Production2

なので、この状態では2択

  1. php artisan config:cacheを実行してキャッシュに.envの内容を反映させる。
  2. php artisan config:clearを実行してキャッシュを消して.envの方をみるようにする。

順にやってみます。

1.もう一度キャッシュコマンドを実行する

  $ php artisan config:cache

   INFO  Configuration cached successfully.

想定通り、修正した.envの内容を表示していますね(キャッシュに反映している)。


2.キャッシュを消す

.envの内容を再度変更して

DB_CONNECTION=Production3

キャッシュを消す

  $ php artisan config:clear

   INFO Configuration cache cleared successfully. 

 

想定通り.envの内容を表示していますね。

キャッシュが消えたのでenv()でも問題なく表示できています。


ということで今回のまとめとしては

  1. .envの設定を参照する場合はconfig()を使う
  2. 開発環境でキャッシュコマンドは実行しない
  3. 本番環境でキャッシュコマンドを実行すべき。ただ実行忘れを防止するためにデプロイ時に自動的に実行するような仕組みにしておくと良い。

くらいですかね。以下のサイトが良くまとまっています。

 【Laravel】.envとphp artisan config:cacheを正しく理解する

 

0 件のコメント:

コメントを投稿

Laravel再学習

フロントエンド系の方に興味が行っていましたがまたバックエンド系に戻ってきました。 Laravelです。 かなり忘れてます、自分のブログを見ながらもう一度です。 今回はMVCパターン、そして Eloquentを使えるようになるのが目的です。 まずはプロジェクト作成から 1. Com...