は、単に$要求を次のコールバック$を呼び出す(ミドルウェアは「合格」することができます)アプリケーションに深く要求を渡すために。 https://laravel.com/docs/5.4/middleware#defining-middleware
Laravelが、それは、スタック内のすべての適用可能なミドルウェアを実行し、要求を処理しています。ミドルウェアは、ルート/コントローラメソッドの前および/または後に実行するように設定できます。
これを行うには、Illuminate\Pipeline\Pipeline
を使用します。基本的には、array_reduce
を使用してミドルウェアスタックを反復処理し、Closure
を返してそのミドルウェアを実行します。この美しさは、array_reverse
を使用して次のミドルウェアの実行を前のものに引き渡すことができます。
をもう少し詳しく説明するには:
をIlluminate\Foundation\Http\[email protected]
が呼び出されると、それはそれで次があるsendRequestThroughRouter
と応答構築:
return (new Pipeline($this->app))
->send($request)
->through($this->app->shouldSkipMiddleware() ? [] : $this->middleware)
->then($this->dispatchToRouter());
Pipeline
はIlluminate\Pipeline\Pipeline
を拡張Illuminate\Routing\Pipeline
です。
上記then()
方法は、基本的に次のとおりです。
->then(function ($request) {
$this->app->instance('request', $request);
return $this->router->dispatch($request);
})
はその後(クロージャが呼び出されていないことをこの時点で覚えている)我々は最終結果を受け入れる閉鎖とオフ始めていることを意味します。
次に、then()
の方法では、前述のようにarray_reduce
とarray_reverse
セクションが発生します。ここで
(これはあなたがどのようにarray_reduce
作品を知っていると仮定し)、実際にthen()
方法で発生した場合の簡単な例です:
[
One::class,
Two::class,
Three::class,
];
:
function then(Closure $destination)
{
$pipeline = array_reduce(
array_reverse($this->middlewares),
//Remember $nextClosure is going to be the closure returned
//from the previous iteration
function ($nextClosure, $middlewareClass) {
//This is the $next closure you see in your middleware
return function ($request) use ($nextClosure, $middlewareClass) {
//Resolve the middleware
$middleware = app($middlewareClass);
//Call the middleware
return $middleware->{$this->method}($request, $nextClosure);
};
},
//The finial closure that will be called that resolves the destination
function ($request) use ($destination) {
return $destination($request);
}
);
return $pipeline($this->request);
}
は、我々は3つのミドルウェアを持っていると言います上記の変数$pipeline
は、基本的には次のようになります。
function ($request) {
return app(One::class)->handle($request, function ($request) {
return app(Two::class)->handle($request, function ($request) {
return app(Three::class)->handle($request, function ($request) {
return $destination($request);
});
};);
};);
};
これが役に立ちます。
コードを検索しますか? –
スタック内の次のミドルウェアクロージャです。 –
@ MagnusErikssonは質問の説明を見てください。私は方法で示唆しているように、その閉鎖を知っています。私が知りたいのは、handle()メソッドが$ nextを閉じるためにどのように変換されるかです。 –