Laravel 是如何請求 Request 的

Laravel00發表於2021-06-26

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

1、從入口檔案開始分析

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

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

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

這裡,$kernel是上面繫結到服務容器中的 Kernel實現例項,也就是App\Http\Kernel::class

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) {
      ...
    } catch (Throwable $e) {
       ...
    }
    ...
    return $response;
}

很輕易的看到,這個方法的作用就是 傳入請求,返回響應。

我們看到,這個方法其實接收了一個 $request ,那麼這個 $request 就是呼叫方 index.php 傳過來的。

3、分析 $request 的來源

index.php 傳過來的 $request:

 $request =  Illuminate\Http\Request::capture()

capture() 方法是這樣的:

public static function capture()
{
    // 啟用對方法請求引數的支援
    static::enableHttpMethodParameterOverride();
    // 將請求資料賦值給 建立的 Request 物件例項,並返回
    return static::createFromBase(
        SymfonyRequest::createFromGlobals()
    );
}

4、再次回到 index.php

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

$request 物件獲取到了,這個物件包含了所有的請求引數,比如請求資料、請求方式、請求 URL、請求頭、使用者IP、是否使用 HTTPS 等。

然後,index.php 中的 $kernel(處理HTTP請求的核心類)就拿著這個請求例項 $request 去 handle(),然後得到響應。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章