好記性不如爛筆頭,學習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 協議》,轉載必須註明作者和本文連結