更新:2024/12/13

Laravelのミドルウェアの意味と使い方について

はるか
はるか
ミドルウェアって知ってる?
ふゅか
ふゅか
Laravelで使うやつよね。リクエストやレスポンスを加工するフィルターみたいな役割をするのよ!
はるか
はるか
例えば?
ふゅか
ふゅか
ログインしてるか確認したり、IPアドレスをフィルタリングしたりすることができるの!

1. ミドルウェアとは?

Laravelのミドルウェアは、HTTPリクエストがアプリケーションに到達する前やレスポンスがブラウザに返される前に、リクエストやレスポンスを処理するためのフィルターのような役割を果たします。
簡単に言うと、「リクエストやレスポンスに対して事前に行う処理を定義する仕組み」です。

たとえば、ユーザーがログインしているかどうかを確認する、特定のリクエストをIPアドレスで制限する、またはリクエストデータを暗号化する、といったことができます。

1.1. ミドルウェアの種類

2. ミドルウェアの主な用途

  • 認証: ユーザーがログインしているか確認する。
  • 権限の確認: ユーザーが特定の操作を行う権限を持っているか検証する。
  • リクエストの変更: リクエストデータを加工する。
  • レスポンスの変更: レスポンスにヘッダーを追加する。
  • セキュリティ対策: CORS(クロスオリジンリクエストの制御)やCSRF(クロスサイトリクエストフォージェリ)の防止。

3. ミドルウェアの作成手順

3.1. ミドルウェアを作成する

Laravelでは、以下のartisanコマンドを使用してミドルウェアを作成できます。

php artisan make:middleware ExampleMiddleware

このコマンドを実行すると、app/Http/Middleware ディレクトリに新しいミドルウェアファイルが作成されます。

3.2. ミドルウェアの処理を記述する

作成された ExampleMiddleware.php を開き、以下のようにhandleメソッドに処理を記述します。

<?php

namespace App\Http\Middleware;

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

class ExampleMiddleware
{
    public function handle(Request $request, Closure $next)
    {
        // リクエストの処理
        if ($request->header('X-Example-Header') !== 'Valid') {
            abort(403);
        }

        // 次のミドルウェアまたはコントローラに渡す
        return $next($request);
    }
}

この例では、リクエストヘッダーに X-Example-Header が含まれていない場合、403エラーを返しています。

3.3. ミドルウェアを登録する

ミドルウェアをアプリケーションに登録するには、app/Http/Kernel.php を編集します。また、次のようにLaravelで登録できるミドルウェアには種類があります。

  • グローバルミドルウェア アプリケーション全体で適用されるミドルウェア。 Kernel.php$middleware に登録。
  • ルートミドルウェア
    特定のルートやルートグループに適用されるミドルウェア。
    Kernel.php$routeMiddleware に登録し、ルートで指定。
  • ミドルウェアグループ 複数のミドルウェアをまとめて適用するためのグループ。 Kernel.php$middlewareGroups に定義。

以下の例では、グローバルミドルウェアとして登録しています。

protected $middleware = [
    // 他のミドルウェア
    \App\Http\Middleware\ExampleMiddleware::class,
];

ルートミドルウェアとして登録したい場合は、以下に追加します。

protected $routeMiddleware = [
    'example' => \App\Http\Middleware\ExampleMiddleware::class,
];
はるか
はるか
ミドルウェアには種類がある?
ふゅか
ふゅか
グローバル、ルート、グループの3つが代表的ね!
はるか
はるか
どう違う?
ふゅか
ふゅか
グローバルはアプリ全体に適用されて、ルートは特定のURLだけ。グループは複数のミドルウェアをまとめて使う感じ!

3.4. ルートでミドルウェアを適用する

ルートに特定のミドルウェアを適用するには、以下のように記述します:

Route::get('/example', function () {
    return 'Hello, Middleware!';
})->middleware('example');

3.5. 複数のミドルウェアの適応

複数のミドルウェアを組み合わせて適用することも可能です。以下のように配列で指定します。

Route::get('/example', function () {
    return 'Hello, Middleware!';
})->middleware(['auth', 'example']);

これにより、リクエストが auth ミドルウェアと example ミドルウェアを順番に通過します。

3.6. ミドルウェアのグループ

特定のルートに複数のミドルウェアをまとめて適用したい場合、ミドルウェアグループを使用します。
Kernel.php でミドルウェアグループを定義します。

protected $middlewareGroups = [
    'web' => [
        // 他のミドルウェア
        \App\Http\Middleware\ExampleMiddleware::class,
    ],
];

web グループを適用したいルートは次のように記述します。

Route::middleware(['web'])->group(function () {
    Route::get('/home', function () {
        return 'Welcome Home!';
    });
});
PR