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');
}