[Laravel] 設定ファイル「.env」の切り替えについて
- 2020年5月22日
- 技術情報
単一のLaravelプロジェクトにおいてURLのパス指定により、データベースの接続先やsessionを切り分けたい場合を考えてみます。
Laravelではデータベースの接続先設定やsessionの保存方法等の基本設定を「.env」と呼ばれる設定ファイルに記述します。
設定ファイル「.env」の追加作成について
環境に応じて、複数の「.env」設定ファイルの切り替えをおこないたい場合、「.env.one」や「.env.two」のように、「.env.」以降に任意の文字列を設定して、あらかじめ各環境に応じた設定ファイルを準備しておきます。
例として以下のように2つの異なるデータベース接続情報をそれぞれの「.env」設定ファイルに準備しました。
.env.one
DB_DATABASE=databaseone
DB_USERNAME=user1
DB_PASSWORD=password1
.env.two
DB_DATABASE=databasetwo
DB_USERNAME=user2
DB_PASSWORD=password2
参照先「.env」の切り替え方法
例として以下のようにアクセスされたURLによりデータベースの接続設定を切り替えたい場合を考えてみます。
「one.example.com」にアクセスした場合、「databaseone」を参照する |
「two.example.com」にアクセスした場合、「databasetwo」を参照する |
このような場合、「.htaccess」に以下のような記述をおこなうことで参照先の切り替えが可能です。
<IfModule mod_rewrite.c>
# Set APP_ENV
SetEnvIf Host "one.example.com" APP_ENV=one
SetEnvIf Host "two.example.com" APP_ENV=two
</IfModule>
例えば、URLのパス設定が以下のような仕様の場合はどうでしょうか。
「one.example.com」ではなく、「example.com/one」の場合 |
「two.example.com」ではなく、「example.com/two」の場合 |
上記のような場合は、「.htaccess」の設定で切り替えをおこなうことはできません。
このような場合は、Laravelのbootstrap>app.phpにて、loadEnvironmentFromメソッドで「.env」ファイルの読み込みに個別に対応する必要があります。具体的には以下のようなコードになります。
$requestedurl = $_SERVER["REQUEST_URI"];
if(strpos($requestedurl,'example.com/one') !== false){
$app->loadEnvironmentFrom('.env.one');
}
if(strpos($requestedurl,'example.com/two') !== false){
$app->loadEnvironmentFrom('.env.two');
}
sessionの共有について
「.env」設定ファイルにてsessionの保存方法の指定をおこなうことが可能です。
SESSION_DRIVER=file
上記の設定部分を以下のように設定変更することで、データベース接続設定の切り分けにあわせてsession情報も分離させることが可能です。
SESSION_DRIVER=database
金曜日担当:nishida
nishida at 2020年05月22日 10:00:31