【Laravel】ミドルウェア(Middleware)の役割を直感的に理解する その2

Laravel

Laravelのミドルウェアにおける「Before(前処理)」と「After(後処理)」のコード構造の違いを解説します。

両者の最大の違いは、「コントローラーなどのメイン処理($next($request))を呼び出す前に自分の処理を書くか、呼んだ後に書くか」という点にあります。

1. Beforeミドルウェア(前処理)の構造

リクエストがアプリケーションのメイン処理に到達するに実行されます。最もよく使われるパターンです。

PHP
<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class EnsureTokenIsValid
{
    /**
     * 送信されてきたリクエストを処理する
     */
    public function handle(Request $request, Closure $next): Response
    {
        // ---------------------------------------------------------
        // 【ここに前処理を書く】
        // ---------------------------------------------------------
        // 例: トークンが不正なら、メイン処理に進ませずにリダイレクトする
        if ($request->input('token') !== 'my-secret-token') {
            return redirect('home');
        }

        // 条件をクリアしたら、次の処理(コントローラーなど)へリクエストを渡す
        return $next($request);
    }
}
  • ポイント: $next($request) を呼び出す前に判定や加工を行います。もし条件に合わない場合は、ここでレスポンス(リダイレクトなど)を返して処理を中断させることができます。

2. Afterミドルウェア(後処理)の構造

コントローラーなどがリクエストを処理し、レスポンスを生成したに実行されます。

PHP
<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class LogResponseTime
{
    /**
     * 送信されてきたリクエストを処理する
     */
    public function handle(Request $request, Closure $next): Response
    {
        // 1. 先に次の処理へリクエストを渡し、コントローラーが作ったレスポンスを受け取る
        $response = $next($request);

        // ---------------------------------------------------------
        // 【ここに後処理を書く】
        // ---------------------------------------------------------
        // 例: 生成されたレスポンスのヘッダーにカスタム情報を追加する
        $response->headers->set('X-App-Version', '1.0.0');

        // 最後に、加工した(あるいはログを取り終えた)レスポンスをブラウザに返す
        return $response;
    }
}
  • ポイント: 先に $response = $next($request); を実行して、背後の処理をすべて終わらせます。手元に戻ってきた $response に対して、データの追加やログ出力などのアクションを行います。

🔄 構造の比較まとめ

違いをシンプルに並べると以下のようになります。

特徴Beforeミドルウェア(前処理)Afterミドルウェア(後処理)
コードの基本形// 自分の処理
return $next($request);
$response = $next($request);
// 自分の処理
return $response;
主な目的アクセス制限、認証チェック、入力データの整形レンスポンスの加工(ヘッダー追加など)、ログ記録
処理の中断可能(コントローラーを実行させずに弾く)不可(すでにコントローラーは実行済み)

このように、return $next($request); を「最後に書くか」「最初に書くか」だけで、役割がガラリと変わるのがLaravelミドルウェアの面白いところです。備忘録のヒントとしてお役立てください!

コメント