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管理する必要もないのです。
誤って公開リポジトリにしてしまったり、開発環境の.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
の設定をここで完成させています。
アプリケーション内では、せっかく完成させたこの値を読み込む方が自然に感じませんか。
設定の完成後は、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
だっけ?となった時がありました。
しかし、環境設定(環境変数)とアプリケーションの設定の違いを明確にすることで、理解を深めることができたと思います。
こう考えてみると、フレームワークというのは本当によく設計されているなと驚くばかりですね。
なんとなく利用するだけでなく、フレームワークの素晴らしいところを見習うことができれば成長に繋がるはずです。
コメント