Laravelのアプリケーション設定(configディレクトリ)と環境設定(.env)の違いと使い方

Laravel
※当サイトはアフィリエイト広告を掲載しています。

LaravelでのWebアプリケーション開発において、設定は必ず行うものです。そして、その設定を手動で引き出したい場合もよくあります。

しかしその際、env関数だっけ!?config関数だっけ!?と分からなくなってしまう方はいないでしょうか。私も最初はそうでした。

振り返ってみると、その時点できちんと理解していなかったのだな、なんとなく使っていたのだな、ということが今ならわかります。

本ページでは、そんなLaraveの環境設定やアプリケーション設定についての考え方をまとめました。なんとなく使っている方の参考になれば幸いです。

Laravelの環境設定とは!?

まず、Laravelの環境設定と呼ばれるものはなんなのか。設定ファイルである.envファイルをベースに見ていきましょう。

.envファイルとは

Laravelの最上位ディレクトリには.envファイルがあります。これはenv=envronmentの略で、環境設定用のファイルです。

この中で環境変数(envronment variable)を定義するためにあります。

環境変数とは、環境に対する値です。

例えば、以下の様な環境ごとに、異なる.envファイルを使うことからもお分りいただけると思います。

  • 開発環境
  • テスト環境(ステージング環境等とも)
  • 本番環境

開発環境と本番環境ではデータベースの接続情報が変わったり、デバッグの方法も変わったりするのが普通ですよね。

機密情報が記載される

.envファイルは環境に応じた機密情報、例えばデータベースのユーザー名やパスワードなども含まれます。

DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=dbname
DB_USERNAME=dbuser
DB_PASSWORD=dbpassword

これらの機密情報も記載されるため、通常はGitリポジトリに含めません。

そもそも環境によって必要な.envは変わるため、Git管理する必要もないのです。

Lara
Lara

誤って公開リポジトリにしてしまったり、開発環境の.envが本番環境にアップされたり等してしまうのを防ぎます。

取得方法

Laravelが用意する、envヘルパー関数を使って取得することが可能です。

$appUrl = env('APP_URL');

アプリケーションの設定ファイルとは!?

次に、Laravelアプリケーションの設定ファイルを見ていきます。

configディレクトリ以下の設定

Laravelの最上位ディレクトリには、configディレクトリがあります。ディレクトリの名称通り、アプリケーションの設定ファイルがその中に定義されます。

以下の様に、配列で定義されます。

<?php

return [
    'option1' => 'value1',
    'option2' => 'value2',
    // その他の設定...
];

もともと多くのファイルが存在していますが、自分で新たにファイルを作ることも可能です。Laravelが勝手に読み込んでくれます。

環境に左右されない&キャッシュさせる

開発環境でも、本番環境でも、同一の設定ファイルを利用します。そのため、configファイルはGit管理されることが一般的です。

加えて言うと、アプリケーション動作時に頻繁に変更される機会はそうないので、config以下の設定はキャッシュして使うことが多いです。

デプロイ時に、以下のコマンドでキャッシュします。

php artisan config:cache

これにより、アプリケーションの実行速度をより早くすることが可能です。

取得方法

例えばデフォルトでは、config/app.phpに、urlという設定があります。

<?php

return [
    // 中略
    'url' => env('APP_URL', 'http://localhost'),

5行目は、環境変数APP_URLが定義されていればそれを利用し、なければhttp://localhostを利用する……という意味のコードです。

この設定は、以下のconifgヘルパー関数で取得可能です。

$appUrl = config('app.url');

ファイル名からphpを抜いた値と、設定値を抜いた値、つまりapp.urlをパラメータとして習得します。

env?config?どっちを使う?

さて、初心者の方にとって、よく分らなくなってしまうのがこれらの使い分けです。どっちを使うべきなのか改めて考えてみましょう。

どちらも同じ値が返ることもある

以下のいずれでも同様の値が取れるケースもあります。

// .env内で以下のように定義されていたとします。
// APP_URL=https://example.jp

$appUrl = env('APP_URL');
// 値: https://example.jp

上記が成立する場合、下記となります。

// config/app.phpで以下になっていたとします。
// 'url' => env('APP_URL', 'http://localhost'),

$appUrl = config('app.url');
// 値: https://example.jp

この場合は同様ですね。

結論

どちらでも同じ結果が得られるのであれば、どちらを使っても良いか……と言えばそうではありません。

結論としては、以下の様に使い分けることが一般的です。

  • configディレクトリ内でのみenv関数を使う
  • それ以外のアプリケーション内ではconfig関数を使う

なぜそうなのかですが、改めてよく考えれば腑に落ちるはずです。次項で説明しましょう。

改めて環境設定とアプリケーション設定の違いは!?

よく言われることとして、configはキャッシュする。envはキャッシュの影響を受けないなどの違いが説明されることがありますが、それ以前の「違い・前提」を理解しておくと分かりやすいと思います。

環境設定の変数は、あくまで環境の設定

まず、環境変数をLaravelアプリケーションの設定ファイルの一つと思ってしまうと混乱する原因になり得ます。

その場合、なぜconfigディレクトリのような似たようなものが別にあるのかと、こんがらがってしまいますからね。

データベースの設定などもあるので、最初は混同してしまうのもおかしいことではないと思います。

しかし、環境設定(環境変数)はただの環境に対応する設定であり、アプリケーションの設定ではありません。

こう捉えると、個人的にはすっと入ってくるように思います。

アプリケーションの設定ファイルはconfigディレクトリ以下のみ

逆に言えば、アプリケーションの設定ファイルは、configディレクトリ以下だけと捉えると分かりやすいです。

configディレクトリ内に限りenv関数を使いますが、それは環境変数の値を利用して設定ファイルを完成させると考えてみてはどうでしょう。

例えば以下のconfig/app.phpを見てみます。

<?php

return [
    // 中略
    'debug' => env('APP_DEBUG', false),

これは、もし.env内にAPP_DEBUGの指定がなかったら、5行目: env関数の第2引数により、デバッグ情報はfalseにする設定としています。

つまり環境変数の利用を試みつつapp.debugの設定をここで完成させています。

Lara
Lara

アプリケーション内では、せっかく完成させたこの値を読み込む方が自然に感じませんか。

逆にアプリケーション内で環境変数を直接読み込むためのenv関数を使いたいシーンは、ぱっと思いつきません。キャッシュもききませんし……。

設定の完成後は、config関数で取得!

というわけで、先ほど書いたことのおさらいです。

原則的に以下の様になることが改めて納得できることでしょう。

  • configディレクトリ内でのみenv関数を使う
    →まだ設定が完成しておらずそこで完成させるから
  • それ以外のアプリケーション内ではconfig関数を使う
    →すでに設定が完成しているから

設定が完成した後、直接.envを参照する必要が生じることは、特別な理由がなければ起こりえないと思います。

Webアプリケーション内ではconfig関数を使う……ということが腑に落ちたのではないでしょうか。

例外

例外として、config関数を使用せずとも済む場合もあります。たとえば以下でも条件分岐に利用することはできます。

$environment = config('app.env');
if($environement == 'production'){
  // 本番環境でのみ実行するコード
}

しかし、専用のファサード・メソッドがある場合、その方が分かりやすい場合もあります。

use Illuminate\Support\Facades\App;

if (App::environment('production')) {
    // 本番環境でのみ実行するコード
}

状況に応じて使いたいですね。

まとめ

最初に書いた通り、私もenvだっけ?configだっけ?となった時がありました。

しかし、環境設定(環境変数)とアプリケーションの設定の違いを明確にすることで、理解を深めることができたと思います。

こう考えてみると、フレームワークというのは本当によく設計されているなと驚くばかりですね。

なんとなく利用するだけでなく、フレームワークの素晴らしいところを見習うことができれば成長に繋がるはずです。

コメント

タイトルとURLをコピーしました