1つのLaravel プロジェクトで DB の接続先を変更して利用したいなぁと思いました。(DB ごとに Laravel プロジェクトを置くのはメンテナンスしなくてもいいように?)
環境設定ファイルの .env ファイルを、Laravel プロジェクトにアクセスしているURLで切り替えたらいいのかもと思い実装してみます。
(1) DB を複数用意します
まずは、基本のMyDBを作ります。MyDB を元に、DBを必要分、複数DBを複製します。
・MyDB001
・MyDB002
今回は、2個用意します。
(2) .env をコピーします
.env に、標準的な設定を書き込んで、ファイル名を変えてコピーして、それぞれに各DBへの接続情報を更新します。
・.env_001
・.env_002
それぞれの、DB接続情報の部分を書き換えます。
(4) ドキュメントルート(今回は、/httpdocs)に、リンクを作成します。
/httpdocs/001 > Laravel プロジェクトの public へリンク
/httpdocs/002 > 同上
ここまでの設定で、https://example.com/001 と https://exsample.com/002 にブラウザにアクセスしたときに、同じ Laravel プロジェクトが応答します。
この段階では、まだ、環境設定ファイルは .env が利用されますので、次の手順で、環境設定ファイルを切り替えます。
(5) app.php に、.env 切替のコードを書きます。
アクセスしてきたURLでDBを切り替えるのに、/bootstrap/app.php に以下のコードを追加します。switch 以下が、追加した部分になります。
<?php
/*
|--------------------------------------------------------------------------
| Create The Application
|--------------------------------------------------------------------------
|
| The first thing we will do is create a new Laravel application instance
| which serves as the "glue" for all the components of Laravel, and is
| the IoC container for the system binding all of the various parts.
|
*/
$app = new Illuminate\Foundation\Application(
$_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
);
switch (substr($_SERVER['PHP_SELF'], 1, 3)) {
case '001':
$app->loadEnvironmentFrom('.env.001');
break;
case '002':
$app->loadEnvironmentFrom('.env.002');
break;
default:
die('DB 切り替えに失敗しました。');
}
(6) 他の方法でも切り替えられる?
サーバーの環境変数、サーバーのホスト名など、いろいろな条件で、切替ることができると思うので、都合のいい方法が見つかると、ちょっと楽できることがあるかもしれないですね。