Laravel可终止中间件和中间件之后的差异



larave中间件理解源

提到,中间件有两种类型:前后。在处理请求之前处理中间件之前,并在处理请求后处理中间件后。

但是可终止的中间件的功能与中间件之后完全相同。那么这两个之间的核心区别是什么?谢谢。

Terminable Middleware在响应准备并准备好后运行。

After Middleware在请求之后运行,但在准备响应之前。

因此,例如,假设您要在响应的全部或一组响应上设置一个响应标头,可以使用后中间件来做到这一点。因为呈现请求后需要设置标头,但是在返回响应之前。但是,如果要将会话数据存储在存储中,则可以使用可终止的中间软件。

这是TerminableInterface中的终止方法:

/**
 * Terminates a request/response cycle.
 *
 * Should be called after sending the response and before shutting down the kernel.
 */
public function terminate(Request $request, Response $response);

您在可终止中间件的终止方法中收到请求和响应对象,但是更改响应不会生效,因为响应已经返回。

此示例应准确显示发生的情况,并且您应该执行某些代码:

class MyMiddleware
{
    public function handle(Request $request, Closure $next)
    {
        // Here: Execute code "before" the response has been "built".
        // Changes here still have effects to your controller actions
        // and views for instance.
        $doStuffBeforeBuiltAndBeforeSent = 'abc';
        // Now, calling `$next($request)` will run a layer of the middleware chain.
        $response = $next($request);
        // Here: Execute code "after" the response has been "built"
        // but before it has been sent.
        $doStuffAfterBuiltAndBeforeSent = 'def';
        
        return $response;
    }
    public function terminate(Request $request, Response $response)
    {
        // Here: execute code after the response has been "sent".
        // Put anything here that might take considerable time which you
        // don't need in the response, e.g.:
        // Logs, stats, external-API calls that don't require the response etc.
        //
        // Note: this requires PHP to run in FastCGI mode.
        $doStuffAfterBuiltAndSent = 'ghi';
        // Note: there are no return values here since the PHP response
        // has been sent already.
    }
}

请注意,假设内核中的MiddleWares的顺序是[One, Two, Three](它类似于回调螺旋结构(:

  • MyMiddlewareOne::class => run before-response code (before $next($request))
  • MyMiddlewareTwo::class => run before-response code
  • MyMiddlewareThree::class => run before-response code
  • MyMiddlewareThree::class => run after-response code (after $next($request))
  • MyMiddlewareTwo::class => run after-response code
  • MyMiddlewareOne::class => run after-response code

最新更新