中間件的壓棧流程並不複雜,柚子心中大概也有個思路,這裏畫出草圖:
中間件在調用時會現獲取最後的中間件(匿名函數對象),然後根據中間件之間的關聯自動進行調用。
/**
* 調用中間件
* 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;
}
}
若想了解更加具體調用過程,依舊需要在使用的時候配合路由來研讀啦。