Laravel プロジェクトのDB接続先を .env ファイルで切り替える

Yossy
2024-12-12
2024-12-12

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) 他の方法でも切り替えられる?


サーバーの環境変数、サーバーのホスト名など、いろいろな条件で、切替ることができると思うので、都合のいい方法が見つかると、ちょっと楽できることがあるかもしれないですね。