Tetsu_Oikawa
@Tetsu_Oikawa (NOBA LISH)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Laravel Middlewareのhandleについて

1. 【必須】やりたい・やりたかったこと

Middlewareのhandleの説明が、教材を見てもよくわからなかったので質問しました。

   public function handle($request, Closure $next)

  --- 実行する処理 ---

まず、第1引数の、$requestで、リクエストに関するRequestインスタンスがわたされると書いてあったのですが、これがよくわからなくて、一番下にある参考記事を元に調べたら、$requestの中にあるインスタンスを使えるようにするために書いてあるということがわかりました。

なので、第2引数のClosure $nextは、$requestの中にあるインスタンスの事なのかと思ったのですが、教科書で、$nextは、Closureクラスのインスタンスですと書かれていたので、$request関係ないものだった?となり、結局$requestが、どういう働きをしているのかよくわからないです。

また、$nextの説明で、ここで渡された$nextは、クロージャとなっており、これを呼び出して実行することで、Requestインスタンスを作成することができるとかいてあったのですが、これも意味がわからなくて、クロージャというのは、無名関数(関数の中身が空のもの)だったと思うのですが、だとすると、教科書に書いてあった、クロージャとなっており、これを呼び出して実行するという文で、中身が入っていない空の関数を実行しても何も起きない(中身に何も言っていないため)と思うのですが、なぜ、リクエストインスタンスをを作成することができるのかがわからないです。

ついでにいえば、ここで出てきたリクエストインスタンスというのは、$requestの中にあるインスタンスの事?だと思ったのですが、なぜ$requestの中にあるインスタンスを新たに作成しようとしているのかもよくわからないです。

以上の事から、handleの中の引数がなんなのかがまるでよくわからなくなってしまったため、質問いたしました。

参考記事

0

1Answer

まずミドルウェアについて説明します。
こちらの記事の図を見てください。2重の円がある図です。

このようにミドルウェアとはコントローラーを包むもので、アクションメソッドの前後で処理をしたい場合に使用します。

そして、その材料として$requestClosure $nextが与えられます。
材料なのでどう使うかはミドルウェア次第です。

$requestは図が示す通りクライアントからのリクエストです。
パラメータなどの情報が含まれるので、パラメータを使って何か処理をすることができます。

Closure $nextは処理を次に進めるために使用します。
次とは他のミドルウェアやコントローラーです。先程の図では、円の中心に進むイメージです。
$next($request)のように使用しますが、これはLaravelのお約束と思ってください。
技術的なところで興味があればLaravelを深掘りしていく事になりますが、ひとまずは「どんなことをしているか」が分かれば大丈夫です。

$next($request)が返すのはレスポンスです。(リクエストではなく)
このレスポンスとはコントローラーが処理した結果と考えてください。
先程の図では、$next($request)から先は円の中心から外に向かうイメージです。
ここでもレスポンス情報を使って何か処理することができます。

コードで書くと次のとおりです。

public function handle($request, Closure $next)
{
    // アクションの実行…(コントローラーのアクションの前)

    $response = $next($request);

    // アクションの実行…(コントローラーのアクションの後)

    return $response;
}

クロージャというのは、無名関数(関数の中身が空のもの)だったと思うのですが

関数の中身はあります。その名前が無いのです。

$plusOne = function($num) {
    return $num + 1;
};

echo $plusOne(2); // 3
0Like

Your answer might help someone💌