Laravel 如何知道请求处理后是否应该运行中间件?

Hex*_*xor 1 laravel laravel-middleware

我读了源代码,只有一个管道将所有中间件作为数组读取。这些中间件应该在请求之前运行dispatchToRouter.

return (new Pipeline($this->app))
    ->send($request)
    ->through($this->app->shouldSkipMiddleware() ? [] : $this->middleware)
    ->then($this->dispatchToRouter()); 
Run Code Online (Sandbox Code Playgroud)

但是,如果我创建了一个后置中间件,则该后置中间件应该在请求处理后运行。这里以及何时在 Laravel 源代码中执行后置中间件?

Sag*_*tam 6

根据laravel官方文档,

中间件是在请求之前还是之后运行取决于中间件本身。

所以,基本上取决于中间件的句柄功能。通常我们在处理请求之前执行中间件,如下所示:

public function handle($request, Closure $next)
{
    // Perform some operation for Ex. checking user role

    return $next($request);
}
Run Code Online (Sandbox Code Playgroud)

在上面的函数中,我们在发送执行操作的请求之前执行一些操作。

在另一种情况下,中间件将在应用程序处理请求后执行其任务,如下所示:

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

    // Perform some operation after the request is handled by the application

    return $response; /* finally, response is returned */
}
Run Code Online (Sandbox Code Playgroud)

综上所述,在中间件之前,我们首先执行一些操作,然后向应用程序发送请求以获得响应,然后将响应返回给客户端。在中间件之后,我们首先向应用程序发送请求以获得响应,然后执行我们的操作,最后将响应从中间件返回到客户端。

您可以查看官方文档:https://laravel.com/docs/5.8/middleware#defining-middleware