LoginSignup
1
0

More than 3 years have passed since last update.

LaravelでURLによってDBを切り替える

Last updated at Posted at 2021-01-24

URLと.envファイルを紐づける

以下のように追記するとURLごとにDBが切り替わる。

bootstrap/app.php
// URLを取得する
$requested_url = $_SERVER["REQUEST_URI"];

// URL中に特定の文字列が含まれていた場合に.envファイルを指定のファイルへ変更する。
if(strpos($requested_url,'sample1') !== false){
    $app->loadEnvironmentFrom('.env.sample1');
}
if(strpos($requested_url,'sample2') !== false){
    $app->loadEnvironmentFrom('.env.sample2');
}

これに合わせて、
.env.sample1
.env.sample2
を.envをコピーして同階層に作成する。

DB_CONNECTIONだけ共通にしておく。

env.sample1/.env.sample2で共通
DB_CONNECTION=samples

database.phpに.envをロードする記述を追記

database.php
        'samples' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],

.envファイルを認識させるのにコマンドを叩く。
Laravelで.envファイルが反映されない時より

php artisan cache:clear
php artisan config:cache

ルーティングの修正

Auth認証など、name属性があるとforeachに失敗するので外しておく。

web.php

$group_id_list = [
    'sample1'
    ,'sample2'
];

foreach($group_id_list as $group_id) {
    Route::group(['prefix' => $group_id],function(){
      Route::get('/','IndexController@index');

        // AuthRouteMethods.phpのルートを手動で記述
        Route::get('login', 'Auth\LoginController@showLoginForm');
        Route::post('login', 'Auth\LoginController@login');
        Route::post('logout', 'Auth\LoginController@logout');

        Route::get('register', 'Auth\RegisterController@showRegistrationForm');
        Route::post('register', 'Auth\RegisterController@register');
});

マイグレーションとシーダーファイルの修正

foreachするなりして複数化する。
シーダーはDBに合わせて変えた方がいい。

Auth認証のルートを上書きする

app/Handlerに以下を追記する
予めセッションにURLの一部を入れている前提で書いていますが、自分のソースに合わせて変えてください。
web.phpでnameを外しているので、route()関数は使えません。

app/Handler.php
    protected function unauthenticated($request, AuthenticationException $exception)
    {
        // セッションからグループURLを取り出す。
        $group_url = request()->session()->get('samples_url');

        return $request->expectsJson()
                    ? response()->json(['message' => $exception->getMessage()], 401)
                    : redirect()->guest($samples_url.'/login');
    }
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0