【Laravel入門】middleware(ミドルウェア)とは

2024年6月15日Laravel,PHP

ミニマリスト_カミ

kamiです。
TwitterYoutubeもやってます。

middleware(ミドルウェア)とは

middlewareとは、HTTPリクエストが送られたタイミングで、
受信されてからレスポンスが返されるまでの間に実行される処理をカプセル化したものです。

ミドルウェアはコントローラークラスの前後で処理を行えます。

                URL(リクエスト)
                    ↓
                ルーティング
                    ↓  ⇦ ミドルウェア(前)
                コントローラー
                                アクションメソッド 
                    ↓  ⇦ ミドルウェア(後)
                レスポンス
                    ↓  ⇦ ビューコンポーザ
                レンダリング※ページの表示

middlewareの使用例

あくまでも一例ですが、ミドルウェアの使用例のイメージをつけて、ミドルウェアについて学んでいきましょう。

  • 認証チェックを行うミドルウェア
  • アクセスログを残すミドルウェア
  • IP制限チェックを行うミドルウェア

スポンサードサーチ

middlewareを使用するためにする4つのこと

icon

middlewareを使用するためにすることは、次の4つを行う必要があります。

middlewareの作成

php artisan make:middleware ミドルウェア名

コマンドを叩くとミドルウェアファイルが作られます。

<?php

namespace App\Http\Middleware;

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

class hogeMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
     */
    public function handle(Request $request, Closure $next): Response
    {
        return $next($request);
    }
}

スポンサードサーチ

kernel.phpへmiddlewareの登録

作成したmiddlewareを「Kernel.php」登録します。
middlewareをHTTPカーネルに登録します。

App名/app/Http/Kernel.php

Kernel.phpファイルにミドルウェアを定義することで、
アプリケーション全体でのリクエストの処理や特定の機能に対する処理を管理しやすくなります。
ミドルウェアは、リクエストの前処理や後処理、認証、ログ記録など、さまざまなタスクに使用されます。

Kernel.php ファイルとは?

Kernel.php ファイルは、Laravelアプリケーションの中核となるクラスであり、アプリケーションの、
HTTPリクエストを処理するための中央処理の機能を提供します。

全てのリクエストに対して実行されるグローバルなミドルウェアを定義するための場所です。

    /**
     * The application's global HTTP middleware stack.
     *
     * These middleware are run during every request to your application.
     *
     * @var array<int, class-string|string>
     */
    protected $middleware = [
        // \App\Http\Middleware\TrustHosts::class,
        \App\Http\Middleware\TrustProxies::class,
        \Illuminate\Http\Middleware\HandleCors::class,
        \App\Http\Middleware\PreventRequestsDuringMaintenance::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
     \App\Http\Middleware\HogeMiddleware::class, // 追加
    ];

$middlewareへミドルウェアを追加する

middlewareプロパティは、HTTPカーネルでグローバルに適用されるミドルウェアを定義します。
このプロパティに指定されたミドルウェアは、アプリケーション内のすべてのリクエストに適用されます。

protected $middleware = [
    \App\Http\Middleware\HogeMiddleware::class
   \App\Http\Middleware\HogeMiddleware::class, // 追加
]

スポンサードサーチ

$middlewareについての説明

TrustProxies

\App\Http\Middleware\TrustProxies::class

プロキシを信頼するためのミドルウェアです。
HTTPSリクエストに対して適切なプロキシ設定を行います。

HandleCors

\Illuminate\Http\Middleware\HandleCors::class

CORS(Cross-Origin Resource Sharing)の設定を処理するためのミドルウェアです。
異なるオリジンからのリクエストに対する制御を行います。

PreventRequestsDuringMaintenance

\App\Http\Middleware\PreventRequestsDuringMaintenance::class

メンテナンスモード中にアプリケーションへのリクエストを制御するためのミドルウェアです。
メンテナンスモードの際に、指定されたIPアドレスからのリクエストのみを許可します。

ValidatePostSize

\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class

POSTリクエストのサイズを検証するためのミドルウェアです。
大きなデータが送信されるのを防ぎます。

TrimStrings

\App\Http\Middleware\TrimStrings::class

リクエストの文字列データから先頭および末尾の余分なスペースをトリミングするためのミドルウェアです。

ConvertEmptyStringsToNull

\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class

空の文字列をNULLに変換するためのミドルウェアです。
データベースに保存する前に文字列の正規化を行います。

これらのミドルウェアは、全てのリクエストに適用されるため、アプリケーション全体の動作やセキュリティの側面をカスタマイズするために重要です。
アプリケーションの特定のニーズに合わせてこれらのミドルウェアをカスタマイズすることができます。

middlewareGroups

特定のルートグループやルート属性に適用されるミドルウェアのグループを定義するためのものです。

  • web: このグループは、WebアプリケーションのHTTPセッションやCSRF保護などのミドルウェアを含みます。
  • api: このグループは、外部APIと通信する場合に使用されるミドルウェアを含みます。
    /**
     * The application's route middleware groups.
     *
     * @var array<string, array<int, class-string|string>>
     */
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

        'api' => [
            // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
            \Illuminate\Routing\Middleware\ThrottleRequests::class.':api',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
    ];

$middlewareGroupsへミドルウェアグループを追加する

$middlewareGroups にはリクエストの種類ごとの設定が配置されます。

protected $middlewareGroups = [
    'web' => [
       // 省略
    ],

    'api' => [
       // 省略
    ,
    'hoge' => [ // 追加
        \App\Http\Middleware\HogeMiddleware::class
     ]
]

EncryptCookies

\App\Http\Middleware\EncryptCookies::class

クッキーを暗号化するためのミドルウェアです。セッションのクッキーが安全に扱われるようにします。

AddQueuedCookiesToResponse

\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class

キューに登録されたクッキーをレスポンスに追加するためのミドルウェアです。

StartSession

\Illuminate\Session\Middleware\StartSession::class:

セッションを開始するためのミドルウェアです。セッションデータの読み書きが可能になります。

ShareErrorsFromSession

\Illuminate\View\Middleware\ShareErrorsFromSession::class

セッションからエラーメッセージをビューに共有するためのミドルウェアです。

VerifyCsrfToken

\App\Http\Middleware\VerifyCsrfToken::class

CSRFトークンを検証するためのミドルウェアです。クロスサイトリクエストフォージェリ対策として使用されます。

SubstituteBindings

\Illuminate\Routing\Middleware\SubstituteBindings::class

ルートモデルバインディングを行うためのミドルウェアです。
コントローラメソッド内でモデルを取得できるようにします。

$middlewareGroupsのapi

ThrottleRequests

\Illuminate\Routing\Middleware\ThrottleRequests::class.':api'

APIリクエストのレートリミットを設定するためのミドルウェアです。APIへの過度なリクエストを制御します。

SubstituteBindings

\Illuminate\Routing\Middleware\SubstituteBindings::class

ルートモデルバインディングを行うためのミドルウェアです。
WEBとAPIでも同様にモデルを取得できるようにします。

middlewareAliasesまたはrouteMiddleware

$middlewareAliasesまたは$routeMiddleware

routeMiddlewareプロパティは、ルート定義で使用されるカスタムミドルウェアのエイリアスを定義します。これにより、ルートで特定のミドルウェアを参照する際に、ミドルウェアクラスの完全修飾名ではなくエイリアスを使用できます。

    /**
     * The application's route middleware.
     *
     * These middleware may be assigned to groups or used individually.
     *
     * @var array<string, class-string|string>
     */
    protected $middlewareAliases = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \App\Http\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
    ];
icon

もう少し補足します。

ルートで一つずつ定義しなくてもrouteMiddlewareで定義しておけば、ミドルウェアを呼び出す際に簡単に行えます。

routeMiddlewareでルート定義

routeMiddlewareではルートで使用するミドルウェアを配列にまとめることができます。

 protected $routeMiddleware = [
     'auth' => \App\Http\Middleware\Authenticate::class,
   'authA' => \App\Http\Middleware\AuthenticateA::class,
     'authB' => \App\Http\Middleware\AuthenticateB::class,
     'authC' => \App\Http\Middleware\AuthenticateC::class,
 ]

routeMiddlewareにまとめて書くことで、ミドルウェアの実行も簡潔に書くことができます。

     public function __construct()
     {
         $this->middleware('auth');
         $this->middleware('authA');
         $this->middleware('authB');
         $this->middleware('authC');
     }

ルート毎にミドルウェアを実行

routeMiddlewareを使わない場合は、一つずつミドウェアを同じルートに記述することになります。

Route::middleware('auth')->get('/user', function (Request $request) {
    return $request->user();
});

Route::middleware('authA')->get('/user', function (Request $request) {
    return $request->user();
});

Route::middleware('authB')->get('/user', function (Request $request) {
    return $request->user();
});

Route::middleware('authC')->get('/user', function (Request $request) {
    return $request->user();
});

auth

'auth' => \App\Http\Middleware\Authenticate::class

ユーザーの認証状態をチェックするためのミドルウェアです。例えば、'auth' ミドルウェアをルートに適用すると、認証されていないユーザーはログインページにリダイレクトされます。

auth.basic

'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,

ベーシック認証(Basic Authentication)を使用してユーザーを認証するためのミドルウェアです。HTTPのヘッダーを使用して認証情報を送信し、認証を行います。

auth.session

'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class,

セッションを使用してユーザーを認証するためのミドルウェアです。ユーザーがログインしたセッション内で認証を保持します。

cache.headers

'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class

レスポンスのキャッシュヘッダーを設定するためのミドルウェアです。キャッシュを適切に制御するために使用されます。

can

'can' => \Illuminate\Auth\Middleware\Authorize::class

ユーザーの権限をチェックし、特定のアクションやリソースへのアクセスを制御するためのミドルウェアです。

guest

'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class

ゲストユーザー(未認証のユーザー)が特定のリソースにアクセスできるかどうかをチェックするためのミドルウェアです。

password.confirm

'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class

重要なアクションの前に、ユーザーにパスワードの確認を求めるためのミドルウェアです。

signed

'signed' => \App\Http\Middleware\ValidateSignature::class

URLに署名を追加してセキュアなリンクを生成するためのミドルウェアです。

throttle

'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class

リクエストの制限をかけて過剰なリクエストの送信を制御するためのミドルウェアです。

verified

'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class

ユーザーのメールアドレスが確認済みであるかどうかをチェックするためのミドルウェアです。

$middlewareAliasesはミドルウェアの名前を短縮したエイリアス(別名)として定義するためのプロパティです。
ミドルウェアを使用する際に、長いクラス名を代わりに短縮された名前で指定するために利用されます。
「auth」エイリアスで「\App\Http\Middleware\Authenticate::class」が呼ばれます。

Route::middleware('auth')->group(function () {
    // ミドルウェアが適用されたルート
});

middlewareGroupsの作成例

middlewareのコマンド作成

artisanコマンドでmiddlewareを作成します。

php artisan make:middleware CustomAuthMiddleware

middlewareのクラスを編集

artisanコマンドでmiddlewareを作成したクラスを編集します。

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class CustomAuthMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        // ログインしているかどうかを確認するために、Auth ファサードを使用します。
        if (Auth::check()) {
            // ログインしている場合は、次のミドルウェアにリクエストを進めます。
            return $next($request);
        }

        // ログインしていない場合は、リダイレクトなどの適切な処理を行います。
        return redirect()->route('login');
    }
}

Kernel.phpに記述

Kernel.phpにmiddlewareを記述します。

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

    'api' => [
        // 他のミドルウェア省略
    ],
];

middlewareにエイリアスを使う

middleware のエイリアスを使用するには、プロパティを使用してミドルウェアにエイリアスを割り当てます。

protected $routeMiddleware = [
    // ミドルウェア例
    'custom_auth' => \App\Http\Middleware\CustomAuthMiddleware::class,
]

middlewareAliasesまたはrouteMiddlewareへミドルウェアを追加する

エイリアス名とアローでパスを指定します。

protected $middlewareAliases = [
    'hogeOne' => \App\Http\Middleware\HogeOneMiddleware::class
    'hogeTwo' => \App\Http\Middleware\HogeTwoMiddleware::class
]

web.phpのルートにミドルウェアのエイリアスを追加する方法

icon

ルートの定義でミドルウェアを使用することで、ルートの実行時にミドルウェアが呼ばれます。

middlewareでエイリアスを使った例は以下のようなイメージになります。

Route::middleware('custom_auth')->get('/example', function () {
    // ここにルートの処理を記述します。
});

エイリアスをグループを使って middlewareを作成することもできます。

Route::middleware('auth')->group(function () {
    // ここに 'auth' ミドルウェアが適用されるルートを定義します。
    Route::get('/dashboard', 'DashboardController@index');
    Route::get('/profile', 'ProfileController@show');
    // 他のルートも同様に追加します。
});

$middlewareGroupsと$routeMiddlewareはweb.phpへ記述してください。

middleware

Route::get('/hoge', function () { return view('hoge'); })->middleware('グループ名');

複数のmiddleware

Route::get('/hoge', function () { return view('hoge'); })->middleware(['hogeOne','hogeTwo']);

groupのmiddleware

Route::group(['middleware' => ['hogeOne']], function () {
    Route::get('/a', function () { return view('a'); });
    Route::get('/b', function () { return view('b'); });
});

Route::group(['middleware' => ['hogeTwo']], function () {
    Route::get('/c', function () { return view('c'); });
    Route::get('/d', function () { return view('d'); });
});

Controllerでミドルウェアを使用する

Kernel.phpに定義されているミドルウェアは、コントローラのコンストラクタで「$this->middleware」を使用して呼び出すことができます。

エイリアスを使ったミドルウェア

    /**
     * Controller constructor.
     */
    public function __construct()
    {
        $this->middleware('custom_auth');
    }

constructが実行されたタイミングで、ミドルウェアが呼ばれます。

エイリアスを使わずにミドルウェアを直接定義

エイリアスを使わずに直接使うこともできます。

    /**
     * Controller constructor.
     */
    public function __construct()
    {
        // ミドルウェアを直接指定
        $this->middleware(\App\Http\Middleware\CustomMiddleware::class);
    }

エイリアスを使った方が可動性が上がるのでおすすめします。

実装やエラーが解決できない場合

プログラミングの実装やエラーでどうしてもわからない場合はメンターに相談するのが一番です。

考えている、見えている範囲が狭くなり、解決から遠くに行って何時間も、何日も経っていることなんてよくある話です。

そういう時は聞ける先輩や、メンターに相談することが大事です。

僕にも相談可能なので気軽に相談してください。

Twitterからの連絡だと確実ですよ。

オンラインスクールやプログラミングスクールといったプログラミングを学べる方法もあるので、そちらもぜひ活用してもいいと思います。

Web開発で分からない時

オンライン完結型スクール DMM WEBCAMP PRO

アプリ開発で分からない時

プログラミング×稼げる副業スキルはテックキャンプ

プログラミングについて分からない時

【コエテコ様限定】※ご案内を受けた以外のメディアが使用しても成果は承認されません。
ミニマリスト_カミ

僕への個人でもメンターでも、スクールでもお好きな方を活用ください。

Laravel,PHPLaravel

Posted by kami