中间件的压栈流程并不复杂,柚子心中大概也有个思路,这里画出草图:
中间件在调用时会现获取最后的中间件(匿名函数对象),然后根据中间件之间的关联自动进行调用。
/**
* 调用中间件
* Call middleware stack
*
* @param ServerRequestInterface $request A request object
* @param ResponseInterface $response A response object
*
* @return ResponseInterface
*/
public function callMiddlewareStack(ServerRequestInterface $request, ResponseInterface $response)
{
if (is_null($this->tip)) {
$this->seedMiddlewareStack();
}
/** @var callable $start */
// 取出栈顶元素(闭包),取的过程要锁栈,取出之后再打开
// 锁栈的过程是不可增加中间件的
// 调用过程也是从tip,最后那个中间件开始调用
$start = $this->tip;
$this->middlewareLock = true;
$response = $start($request, $response);
$this->middlewareLock = false;
return $response;
}
}
若想了解更加具体调用过程,依旧需要在使用的时候配合路由来研读啦。