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