.envファイルについて

.envファイルを使って開発環境と本番環境を切り替えたり、データベースなどの接続情報の変更を行うことができます。つまりLaravelにとって重要な設定変更.は.envファイルを介することで簡単に行うことができます。例えば開発環境では簡易的に利用できるsqliteのデータベースに接続し、本番環境ではmysqlのDBに接続といった変更が可能です。

.envファイルの中身は複数のキーと値のペアで記述されており、configディレクトリ下のデータベースを含めた各種機能の設定ファイルの中(database.php, session.php, logging.php etc.)で.envファイルのキーと値が読み込まれています。

envはenvironmentの短縮形で意味は環境です。

.envファイルの値を変更してみよう

言葉だけの説明だけでは.envの働きを理解するのは難しいので実際に.envファイルにあるAPP_DEBUGの値を変えることでどのような変化があるか確認してみます。

.envファイル内のAPP_DEBUGはデフォルトではtrueに設定されています。APP_DEBUGはLaravelにアクセスしている時にプログラムの記述ミスやバグがあった場合に原因を究明するために必要となるエラーメッセージの詳細情報を出力してくれます。

意図的にエラーを発生させるためにbladeファイルに以下を記述しますが、$somethingの変数には何も値を入れていません。


	<h1>Laravel ENV FILE</h1>
	<p>{{ $somethig }}</p>

ブラウザからアクセスすると以下のエラーの詳細画面が表示されます。エラー内容はUndefined variable something(定義されていない変数something)です。このようにAPP_DEBUGの設定によりエラーの原因を把握することができます。

APP_DEBUGがtrueの場合
APP_DEBUGがtrueの場合

次に.envファイル内のAPP_DEBUGの値をtrueからfalseに設定してみましょう。


APP_DEBUG=false

APP_DEBUGの値をfalseに設定するとエラーメッセージの詳細情報は出力されず500 Server Errorが表示されます。これでは原因がわかりませんが本番環境ではエラーの詳細情報をユーザに直接見せないためにAPP_DEBUGはfalseに設定します。

APP_DEBUGの値をfalseに
APP_DEBUGの値をfalseに
.envファイルの中身を書き換えた場合は、php artisan config:clearコマンドを実行してください。

.envの現在の値を確認してみよう

.envファイルに設定されている値が現在どのような値になっているかはenvヘルパー関数を利用することで確認することができます。


	<h1>Laravel ENV FILE</h1>
	<p>{{ env('DB_CONNECTION')}}</p>

envファイルを書き換えた場合に設定値が反映されているのか確認したいという時はenvヘルパー関数を使用してみてください。しかし.envファイルは一度ロードされてキャッシュされるとenvヘルパー関数を実行しても値はNULLになり画面にはなにも表示されません。その場合はphp artisan config:clearを実行してください。

php artisan config:cacheというコマンドもありますが、実行後キャッシュをクリアにして再度キャッシュするという動作を行うため、このコマンドを実行後にenvヘルパー関数を実行しても値は表示されません。

config:cacheを実行すると下記のように表示されます。


$ php artisan config:cache
Configuration cache cleared!
Configuration cached successfully!

configについて

ここまでの説明で.envファイルがどのような役割を持っているかが少しだけ理解できたかと思います。さらに理解を深めるためAPP_DUBUG以外の設定がどのように利用されるか確認してきます。

.envファイルにはキーと値のペアが記述されており、それらのペアはconfigディレクトリ以下の各種機能の設定ファイルの中で利用されています。

どのようにenvファイルが利用されているか確認し、確認後に設定されている設定値についてconfig関数を使ってその値を取り出します。

データベースの設定の確認を行う

データベースの設定はconfigディレクトリ下にあるdatabase.phpファイルで行っています。設定値の大半は、env関数を利用して.envファイルから値を読み込んでいます。

.envファイルの利用方法をdatabase.phpファイルの上部に記述されているdefault値の設定で説明を行います。


'default' => env('DB_CONNECTION', 'mysql'),

上記の記述であれば、DB_CONNECTIONの設定値はmysqlに設定されていると思ってしまうかもしれませんが実際はそうではありません。上記の設定はもし.envファイルにDB_CONNECTIONが設定されていなければdefaultにmysqlが設定されるということを表しています。初期設定ではDB_CONNECTIONにmysqlが設定されているので、いずれにせよdefaultの値はmysqlが設定されます。

defaultに設定されている値は、config関数を利用することで確認することができるのでconfig関数を利用してdafaultの設定について確認します。

config関数について

config関数を使うとconfigディレクトリ以下で設定されている各種設定値の値を確認することができます。

database.phpファイルではenv関数を使ってdefault値を設定を行っていることは先程説明しました。実際の設定値はconfig(‘database.default’)で見ることができます。


	<h1>Laravel ENV FILE</h1>
	<p>{{ config('database.default') }}</p>
例えばconfig(‘filesystems.disks.s3.region’)と設定すればfilsystems.phpファイルに設定されているs3のregionの値を読み取ることができ、envファイルのAWS_DEFAULT_REGIONに設定されているus-east-1を確認することができます。

画面には、mysqlと表示されます。

もし、.envファイルのDB_CONNECTIONに文字列abcdefを設定するとどうなるか確認しましょう。


DB_CONNECTION=abcdef

ブラウザでアクセスするとabcdefが表示されます。

databaseのdefault値を確認する
databaseのdefault値を確認する

.envファイルからDB_CONNECTIONを削除するとmysqlが表示されます。つまり、env関数では.envファイルのDB_CONNECTIONがあればその値を使用し、なければmysqlを使っていることが確認できます。

.envファイルを利用する

例えばサードパーティのアプリケーションをLaravelで使用することになった場合にパスワードを.envファイルに保存するとenv関数を利用してその値を取り出し使用することができます。


EXAMPLE_APP_KEY = 123456789ABCDEF

.envに上記を追加した後、php artisan config:clearでキャッシュを削除しブラウザでアクセスすると画面に123456789ABCDEFが表示されます。このように.envファイルに記述した内容を取得できることがわかりました。

独自configファイルを作成する

独自で作成したconfigファイルの中身もconfig関数を利用して取得することができます。configディレクトリの下にexample.phpを作成します。


<?php

return [

    'key' => env('EXAMPLE_APP_KEY', 'XXXXX'),

];

.envファイルにEXAMPLE_APP_KEYの記述を行っておけば、config(‘example.key’)を使って値を取得することでその値をLaravelのプログラムで使用することができます。

本番(production)と開発(local)について

本番環境と開発環境の切り替えは.envファイルのAPP_ENVを利用して行うことができます。現在の設定値はphp artisan envを使って確認することができます。


 $ php artisan env
Current application environment: local
env_test $ 

プログラムの中で本番と開発の分岐を行いたい場合は、App::environment()を利用することができます。

APP_ENVの設定値はproduction, localだけではなくdevelopmentなど他の文字列も使用することができます。

App::environment()を使って下記のように分岐を行うことができます。


if (App::environment('local')) {
    // 環境がlocal(開発)の場合
}elseif(App::environment('production')) {
    // 環境がproduction(本番)の場合
}else{
   // その他の環境
}

gitを利用した場合

git cloneを利用してレポジトリからLaravelの情報をコピーした場合は.envファイルは含まれていません。.gitignoreに.envファイルが含まれているためリポジトリにアップされることはありません。.envには重要な情報が含まれているためです。そのためgit cloneを利用した場合はサーバ上で.env.exampleファイルを複製して.envファイルに情報を書き込む必要があります。

ここまで読み進めた人は.envファイルがどのようなものか理解できたかと思います。ぜひこの知識を元にLaravelでの開発を進めてください。