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つの方法があります。
- routes/api.phpに記載
- ハンドラメソッドのコンストラクタに記載
ここでは、「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');
});