laravelpro_ミドルウェアとは?

06ミドルウェアとは?

LaravelのMiddlewareは、HTTPリクエストを処理する際にリクエストとレスポンスの中間に割り込む仕組みです。 Middlewareを使用することでリクエストに対して、フィルタリング、リクエストされる値の変換、ログ記録などの共通処理を行うことができます。

ミドルウェアの使用用途

認証

ユーザーの認証状態を確認するために使用します。 ログインしていないユーザーに対して特定のページやアクションのアクセス制限を設けることが可能です。

ログ記録

リクエストやレスポンスのログを記録するためにMiddlewareを使用することでアプリケーションの動作を監視し、不具合が発生した場合に解決に役立てることができます。

リクエストの変換

リクエストのデータを変換したりバリデーションを行ったりする処理が可能です。

リクエストの特定のフィールドを整形したり、特定のルールに従ってバリデーションエラーを発生させたりすることが可能です。

レスポンスの変換

レスポンスを加工して特定のフォーマットに整形することが可能です。

JSONやXMLなどのフォーマットにレスポンスを変換するといったことができます。

ミドルウェア実装方法

※以下のミドルウェアに関するコマンド・ソースコードは記載例であり、どこかに記載する必要はありません。

artisanコマンドでミドルウェアクラスを作成

php artisan make:middleware AuthenticateMiddleware

AuthenticateMiddlewareクラスが作成されるのでhandle()に実際の処理を記述します。 各使用例に応じた具体的な実装方法は後述します。

class AuthenticateMiddleware { public function handle($request, Closure $next) {
    // リクエストを処理する前のMiddlewareの共通処理 //
    例:ログ記録、認証チェックなど $response = $next($request); //
    レスポンスを加工する処理(必要な場合のみ) return $response; }
}

ミドルウェアを使用できるように設定する

特定のルートにMiddlewareを適用する

ルートに割り当てるためにapp/Http/Kernel.phpの$routeMiddleware配列に設定します。

protected $routeMiddleware = [
    'authenticateMiddleware' =>
    \\App\\Http\\Middleware\\AuthenticateMiddleware::class,
];

middlewareメソッドを使用してミドルウェアをルートに割り当てることができます。

Route::get('/index', function () {
    //
})->middleware('authenticateMiddleware');

特定のルートに複数Middlewareを適用する

app/Http/Kernel.phpの$middlewareGroups配列に登録します。

protected $middlewareGroups = [
    'web' => [
        \\App\\Http\\Middleware\\EncryptCookies::class,
        \\App\\Http\\Middleware\\VerifyCsrfToken::class
    ],
]

ミドルウェアがHTTPカーネルで定義したらmiddlewareメソッドを使用してミドルウェアをルートに割り当てることができます。

web.php

Route::get('/index', function () {
    //
})->middleware('web');

複数のMiddlewareを指定することもできます。

Route::post('/index', function () {
    //
})->middleware(['web', 'authenticateMiddleware']);

複数ルートにMiddlewareを適用する

groupメソッドを使用することで複数のルートにMiddlewareをまとめて適用させることができます。

Route::group(['middleware' => ['authenticateMiddleware']], function () {
    Route::get('/index', function () {
    })
    Route::post('/index', function () {
    })
}

ミドルウェアの優先順位を設定する

protected $middlewarePriority = [
    \\App\\Http\\Middleware\\AuthenticateMiddleware::class,
    \\App\\Http\\Middleware\\LogRequestMiddleware::class,
];

このように設定することでAuthenticateMiddlewareLogRequestMiddlewareより先に実行されるようになります。

ミドルウェアの使用例

認証チェック

例:ユーザーが認証済みでなかった場合にログインページにリダイレクトさせる処理

class AuthenticateMiddleware {
    public function handle($request, Closure $next) {
        // 認証済みかチェック
        if (!Auth::check()) {
            return redirect()->route('login'); // ログインページにリダイレクト
        } return $next($request);
    }
}

ログ記録

例:不具合発生時のトラブルシューティングのためにアクセスされたURLをログに出力させる処理

class LogRequestMiddleware {
    public function handle($request, Closure $next) {
        // リクエストされたURLをログに出力
        Log::info($request->url());
        return $next($request);
    }
}

リクエストの変換

例:ユーザーからリクエストされたデータを加工する処理

class ConvertRequestMiddleware {
    public function handle($request, Closure $next) {
        // リクエストパラメータに値を追加する
        $request->merge(['hoge' => 'テスト']);
        return $next($request);
    }
}

レスポンスの変換

例:ユーザーにレスポンスを返す際に形式を変更したうえでレスポンスを返す処理

class ConvertResponseToJsonMiddleware {
   public function handle($request, Closure $next) {
     $response = $next($request);
     // レスポンスをJSON形式に変換
     $data = $response->original;
     $jsonResponse = response()->json($data);
     return $jsonResponse;
   }
}


投稿日

カテゴリー:

投稿者:

タグ:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です