🔥

【学習メモ】Laravelのミドルウェアについて調べたこと

2021/04/06に公開

Laravelにはミドルウェアという仕組みがあります。

認証やバリデーションに使われるらしいのですが、具体的にどのように動作しているのかを全く知らなかったため、自分なりに調べたことをまとめておきます。

・そも、ミドルウェアとは?
Laravelミドルウェアの基本入門(&出力HTMLをminifyしWebサイト高速化)
Laravel5.8(公式サイト)
を読んだところ、ミドルウェアには「Beforeミドルウェア」と「Afterミドルウェア」があることがわかりました。
両者はそのミドルウェアがどのタイミングで動作するかによって分けられるらしいです。

クライアントからのリクエスト〜サーバからのレスポンスの流れをミドルウェアを含めて追うと、

ミドルウェアがクライアントからのリクエストを受け取る。
②リクエストに付随した情報(GETならクエリー文字列、POSTならbody)を処理する。(Beforeミドルウェア)
ミドルウェアが②で処理された情報をコントローラーに送る。(認証の場合、送らずにそのままリダイレクトすることもある)
④コントローラーからビューを選択し、必要があれば情報を渡す。
⑤ビューがページをレンダリングする。
⑥⑤でレンダリングされたページを含めた情報を、コントローラーがレスポンスとしてミドルウェアに送り返す。
⑦⑥で送り返された情報を処理する。(Afterミドルウェア)
⑧⑦の情報を、ミドルウェアがクライアントに送る。

上記のような流れなので、「このミドルウェアはBeforeミドルウェアかAfterミドルウェアか?」は、そのミドルウェアがどのタイミングでコントローラーに情報を渡すか(リクエストするか)
によって決定されます。

ミドルウェアからコントローラーにリクエストするには$next($request)を実行する必要があるため、それぞれは

Beforeミドルウェア

<?php

namespace App\Http\Middleware;

use Closure;

class BeforeMiddleware
{
    public function handle($request, Closure $next)
    {
        // アクションを実行…

        return $next($request);
    }
}

Afterミドルウェア

<?php

namespace App\Http\Middleware;

use Closure;

class AfterMiddleware
{
    public function handle($request, Closure $next)
    {
        $response = $next($request);

        // アクションを実行…

        return $response;
    }
}

と、$next($request)を呼ぶ位置によって区別されます。
直感としては後述のRouteで設定するのかな?と思っていましたが、ミドルウェアを記述するファイルの中で前か後かを指定するようです。

・どうやって作成するか。

$php artisan make:middleware hogeMiddleware

・どこに作られるか。

app/Http/Middleware

・どうやって実行するか。
作成したミドルウェアはそのままでは実行されません。そのため「このコントローラーの前/後に動作してね」と指定しなければなりません。(コントローラーとミドルウェアを紐付けなければなりません)
そのためにはweb.phpを開き、

use App¥Http¥Middleware¥hogeMiddleware;

Route::get('hogehoge', 'hogehogeController@hogehoge')
       ->middleware(hogeMiddleware::class);

と記述します。
こうすることで、(URL)/hogehogeへのGETリクエストが来た場合は、hogeMiddlewareにリクエストが渡され、クライアントへのレスポンスもhogeMiddlewareから返されるようになります。

$next($request)の返り値
$next($request)はコントローラーのアクションが実行された結果が返されます。

Discussion