Laravel 是怎樣響應 Response 的呢 ?

Laravel00發表於2021-06-26

好記性不如爛筆頭,學習php開發也不能懶,作筆記是一種學習的好習慣!
文章來自:www.haveyb.com/article/169
學習與交流:Laravel技術交流微信群

1、從入口檔案開始分析

Laravel的入口檔案是 /public/index.php。

在index.php 中,處理請求的程式碼是:

$response = $kernel->handle(
    $request = Illuminate\Http\Request::capture()
);

Laravel 請求類 Request 剖析 說明了 $request 是如何獲得的,下面將著重分析 handle 方法是如何處理請求的。

2、分析 $kernel 呼叫的 handle() 方法

它呼叫了 handle() 方法,在 App\Http\Kernel.php 中並沒有 handle() 方法,因此它呼叫的其實是它的父類中的handle方法。

它的父類 handle() 方法是這樣:

public function handle($request)
{
        try {
            // 啟用對方法請求引數的支援
            $request->enableHttpMethodParameterOverride();
            // 通過中介軟體/路由器傳送給定的請求
            $response = $this->sendRequestThroughRouter($request);
        } catch (Exception $e) {
          ...
        }
        $this->app['events']->dispatch(
            new RequestHandled($request, $response)
        );
        return $response;
}

可以看到,解析請求獲得響應的關鍵就在這一行程式碼:

$response = $this->sendRequestThroughRouter($request);

這個方法是這樣的:

protected function sendRequestThroughRouter($request)
{
    // 將現有例項註冊為容器中的共享例項
    $this->app->instance('request', $request);
    // 清除已解析的外觀例項
    Facade::clearResolvedInstance('request');
    // 在傳送請求到路由之前,呼叫 bootstrap() 方法運用應用的啟動類
    $this->bootstrap();
    // 以管道模式來處理 HTTP 請求
    return (new Pipeline($this->app))
        ->send($request)
        ->through($this->app->shouldSkipMiddleware() ? [] : $this->middleware)
        ->then($this->dispatchToRouter());

注:

new Pipeline($this->app)// 建立 Illuminate\Routing\Pipeline 例項,並將應用例項 $this->app 賦值給 Illuminate\Pipeline\Pipeline 的 container 容器屬性
send($request)// 設定通過管道傳送的物件,把request 賦值給 Illuminate\Pipeline\Pipeline 的 passable屬性
through($this->app->shouldSkipMiddleware() ? [] : $this->middleware)
// 確定是否已為應用程式禁用中介軟體
then($this->dispatchToRouter())
// 獲取路由排程程式回撥,使用最終回撥執行管道
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章