日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

Laravel 底层是如何处理 HTTP 请求的?

發(fā)布時(shí)間:2023/11/27 生活经验 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Laravel 底层是如何处理 HTTP 请求的? 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

基于 Laravel 框架構(gòu)建的 Web 應(yīng)用處理 HTTP 請(qǐng)求的流程也是如此。所有 HTTP 請(qǐng)求都會(huì)被轉(zhuǎn)發(fā)到單入口文件?public/index.php,處理 HTTP 請(qǐng)求的核心代碼如下(忽略 HTTP 請(qǐng)求處理之外的代碼):

$app = new Illuminate\Foundation\Application(
realpath(__DIR__.'/../')
); // 綁定處理 HTTP 請(qǐng)求的接口實(shí)現(xiàn)到服務(wù)容器
$app->singleton(
Illuminate\Contracts\Http\Kernel::class,
App\Http\Kernel::class
);// 從服務(wù)容器中解析處理 HTTP 請(qǐng)求的 Kernel 實(shí)例
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);// 處理 HTTP 請(qǐng)求的核心代碼
$response = $kernel->handle(
$request = Illuminate\Http\Request::capture()
);// 發(fā)送響應(yīng)
$response->send();// 終止程序,做一些善后及清理工作
$kernel->terminate($request, $response);

?

在上面這段程序中,首先會(huì)創(chuàng)建一個(gè)?Application?實(shí)例,作為全局的服務(wù)容器,然后將處理請(qǐng)求的核心類 Kernel 實(shí)現(xiàn)實(shí)例綁定到該容器中,以便后續(xù)通過(guò)它處理 HTTP 請(qǐng)求。我們通過(guò)服務(wù)器捕獲請(qǐng)求并將其傳遞給 Kernel 實(shí)例進(jìn)行處理,處理結(jié)果是準(zhǔn)備好的響應(yīng)實(shí)例,調(diào)用該響應(yīng)實(shí)例的?send()?方法即可將其發(fā)送給發(fā)起請(qǐng)求的客戶端。最后,我們執(zhí)行 Kernel 實(shí)例上的?terminate()?終止程序,退出腳本。

以上就是 Laravel 框架處理 HTTP 請(qǐng)求的一般流程,所有核心邏輯都位于?$kernel->handle()?方法調(diào)用中。下面我們就來(lái)一探究竟。

?

服務(wù)容器

Laravel 框架提供了一個(gè)功能強(qiáng)大的服務(wù)容器,用于管理類之間的依賴關(guān)系,關(guān)于其底層原理還可以參考學(xué)徒到工匠系列中的介紹,這里我們就不深入展開了。服務(wù)容器封裝了綁定到某個(gè)接口的對(duì)應(yīng)實(shí)現(xiàn)類的實(shí)例化過(guò)程,你可以在需要對(duì)應(yīng)實(shí)現(xiàn)實(shí)例的時(shí)候通過(guò)接口從容器中獲取。

在上面的代碼中,$app?對(duì)應(yīng)的就是服務(wù)容器實(shí)例,并且在我們獲取到該實(shí)例后就注冊(cè)了 Kernel 接口及其實(shí)現(xiàn)類到容器中:

$app->singleton(
Illuminate\Contracts\Http\Kernel::class,
App\Http\Kernel::class
);singleton 方法會(huì)以單例方式在服務(wù)容器中將 App\Http\Kernel 實(shí)例綁定到 Illuminate\Contracts\Http\Kernel 接口,后續(xù)我們要獲取 App\Http\Kernel 實(shí)例,就可以通過(guò) Illuminate\Contracts\Http\Kernel 接口從服務(wù)容器中獲取,獲取方法是 $app->make():$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

?

回到 Kernel

下面我們就正式進(jìn)入?$kernel->handle()?方法內(nèi)部看看 HTTP 請(qǐng)求是被如何處理的。打開?Illuminate\Foundation\Http\Kernel?(App\Http\Kernel?的父類),查看?handle?方法,可以看到核心處理邏輯通過(guò)?sendRequestThroughRouter?方法實(shí)現(xiàn):

protected function sendRequestThroughRouter($request)
{
$this->app->instance('request', $request);Facade::clearResolvedInstance('request');$this->bootstrap();return (new Pipeline($this->app))
->send($request)
->through($this->app->shouldSkipMiddleware() ? [] : $this->middleware)
->then($this->dispatchToRouter());
}在發(fā)送請(qǐng)求到路由之前,先調(diào)用 bootstrap() 方法運(yùn)用應(yīng)用的啟動(dòng)類:protected $bootstrappers = [
\Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables::class,
\Illuminate\Foundation\Bootstrap\LoadConfiguration::class,
\Illuminate\Foundation\Bootstrap\HandleExceptions::class,
\Illuminate\Foundation\Bootstrap\RegisterFacades::class,
\Illuminate\Foundation\Bootstrap\RegisterProviders::class,
\Illuminate\Foundation\Bootstrap\BootProviders::class,
];

?

這些個(gè)啟動(dòng)類在路由解析之前執(zhí)行,相當(dāng)于對(duì)整個(gè)應(yīng)用進(jìn)行初始化。通過(guò)類名就能窺探出對(duì)應(yīng)的操作意圖,分別是加載環(huán)境變量和全局配置、配置異常處理邏輯、注冊(cè)門面和服務(wù)提供者(根據(jù)?config/app.php?中的?providers?和?alias配置值)、以及執(zhí)行所有已注冊(cè)服務(wù)提供者的?boot?方法,具體的實(shí)現(xiàn)邏輯我這里就不一一展開的,你可以自己去看下。

然后就是真正的 HTTP 請(qǐng)求處理了:

return (new Pipeline($this->app))
->send($request)
->through($this->app->shouldSkipMiddleware() ? [] : $this->middleware)
->then($this->dispatchToRouter());

?

Laravel 框架以管道模式來(lái)處理 HTTP 請(qǐng)求,首先通過(guò)全局中間件對(duì)請(qǐng)求進(jìn)行處理,如果返回 false 直接退出,不會(huì)做路由解析處理。

全局中間件都校驗(yàn)通過(guò)才會(huì)將請(qǐng)求分發(fā)到路由器進(jìn)行處理,路由器會(huì)將請(qǐng)求 URL 路徑與應(yīng)用注冊(cè)的所有路由進(jìn)行匹配,如果有匹配的路由,則先收集該路由所分配的所有路由中間件,通過(guò)這些路由中間件對(duì)請(qǐng)求進(jìn)行過(guò)濾,所有路由中間件校驗(yàn)通過(guò)才會(huì)運(yùn)行對(duì)應(yīng)的匿名函數(shù)或控制器方法,執(zhí)行相應(yīng)的請(qǐng)求處理邏輯,最后準(zhǔn)備好待發(fā)送給客戶端的響應(yīng)。

終止 Kernel

響應(yīng)準(zhǔn)備就緒后,就會(huì)通過(guò)?$response->send()?發(fā)送給發(fā)起請(qǐng)求的客戶端,之后還要運(yùn)行?$kernel->terminate()?做一些善后清理工作,并最終退出腳本。這些善后清理工作主要包括運(yùn)行終止中間件,以及注冊(cè)到服務(wù)容器的一些終止回調(diào):

public function terminate($request, $response)
{
$this->terminateMiddleware($request, $response);$this->app->terminate();
}

?

轉(zhuǎn)載于:https://www.cnblogs.com/mo3408/p/10979279.html

總結(jié)

以上是生活随笔為你收集整理的Laravel 底层是如何处理 HTTP 请求的?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。