LoginSignup
0
0

More than 3 years have passed since last update.

LaravelでAPI単位で接続先DBを切り替える

Posted at

TL; DR

Laravelでは、接続先のDBのホストのread/write接続が自動的に設定されすが、OracleDatabaseへの接続をyajra/OCI8を用いると、このread/write接続が行えません。

そのため、Middlewareにて、エンドポイント単位で接続先のDBを切り替えます。

環境

  • Windows 10
  • PHP 7.2
  • Laravel 5.5
  • Oci8 5
  • Oracle database

Middleware作成

今回は、read接続先指定用とwrite接続先指定用のMiddlewareを作成します。
作成手順は、以下の要領です。

/var/www/html# php artisan make:middleware ConnectWriteDatabase
Middleware created successfully.
/var/www/html# php artisan make:middleware ConnectReadDatabase
Middleware created successfully.

これで、以下のMiddlewareが作成されました。

ConnectWriteDatabase.php

<?php
namespace App\Http\Middleware;
use Closure;
class ConnectWriteDatabase
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        return $next($request);
    }
}

ConnectReadDatabase.php

<?php
namespace App\Http\Middleware;
use Closure;
class ConnectReadDatabase
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        return $next($request);
    }
}

Middlewareの登録

作成したMidllewareはそのままでは使用できません。そのため、使用できるようにするためには、Karnel.phpへの登録が必要です。通常ですとMiddlewareを全HTTPリクエストに適用するにはGlobal MiddlewareとしてKarnerl.phpへの登録を行う必要があります。

ですが、今回は特定のHTTPリクエストに対してMiddlewareを適用するため、Kernelの$routeMiddlewareへの登録を行います。

App\Http\Kernel.php

<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
/** 省略 */
    /**
     * The application's route middleware.
     *
     * These middleware may be assigned to groups or used individually.
     *
     * @var array
     */
    protected $routeMiddleware = [
        // ここにMidlewareを追加
        'connect.write' => \App\Http\Middleware\ConnectWriteDatabase::class,
    ];
}

Middlewareのエンドポイントへの適用

指定したエンドポイントに作成したMiddlewareを適用するには、大きく2つの方法があります。

  1. routes/api.phpに記載
  2. ハンドラメソッドのコンストラクタに記載

ここでは、「1.routes/api.phpに記載」の方法をとります。
Laravelでは、Routingの設定では、routesディレクトリ直下のルートファイルで定義をします。
このとき、RouteGroupを使用することで、複数のRoutingの定義対象に対して、適用するMiddlewareを指定することができます。

例:公式ドキュメントRoutingから抜粋

Route::middleware(['first', 'second'])->group(function () {
    Route::get('/', function () {
        // firstとsecondミドルウェアを使用
    });
    Route::get('user/profile', function () {
        // firstとsecondミドルウェアを使用
    });
});

この要領で、write接続を行うエンドポイントを定義するRouteメソッドをGroupで定義し、Middlewareconnect.writeの指定を行います。

Route::middleware(['connect.write'])->group(function () {
    Route::post('/user', '/Api/User/StoreAction');
    Route::put('/user/{user}', '/Api/User/UpdateAction');
});
0
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
0
0