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

Laravel,PHP

ミニマリスト_カミ

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

middleware(ミドルウェア)とは

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

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

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

middlewareの作成方法

icon

middlewareの作成では次の3つを行う必要があります。

  • App/Http/Middleware配下にミドルウェアを作成
  • app/Http/Kernel.phpにミドルウェアをHTTPカーネルに登録
  • routes/web.phpにルートを定義

スポンサードサーチ

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にmiddlewareを指定

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

    /**
     * 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\TrustProxies::class

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

\Illuminate\Http\Middleware\HandleCors::class

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

\App\Http\Middleware\PreventRequestsDuringMaintenance::class

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

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

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

\App\Http\Middleware\TrimStrings::class

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

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

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

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

スポンサードサーチ

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

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

protected $middleware = [
    \App\Http\Middleware\HogeMiddleware::class
]

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,
    ];

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へエイリアスを追加

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'); });
});

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

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

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

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

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

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

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

Web開発で分からない時

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

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

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

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

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

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

Laravel,PHPLaravel

Posted by kami