請(qǐng)求周期
請(qǐng)求周期
請(qǐng)求生命周期
介紹
在「日常生活」中 使用任何工具時(shí),如果理解了該工具的工作原理。那么用起來(lái)就會(huì)更加得心應(yīng)手。應(yīng)用開(kāi)發(fā)也是如此,當(dāng)你能真正懂得一個(gè)功能背后實(shí)現(xiàn)原理時(shí),用起來(lái)會(huì)更加順手,方便。
文檔存在目的是為了讓你更加清晰地了解 Laravel 框架是如何工作。通過(guò)框架進(jìn)行全面了解,讓一切都不再感覺(jué)很「神奇」。相信我,這有助于你更加清楚自己在做什么,對(duì)自己想做的事情更加胸有成竹。就算你不明白所有的術(shù)語(yǔ),也不用因此失去信心!只要多一點(diǎn)嘗試、學(xué)著如何運(yùn)用,隨著你瀏覽文檔的其他部分,你的知識(shí)一定會(huì)因此增長(zhǎng)。
生命周期概述
首先
Laravel 應(yīng)用的所有請(qǐng)求入口都是 public/index.php
文件。而所有的請(qǐng)求都是經(jīng)由你的 Web 服務(wù)器(Apache/Nginx)通過(guò)配置引導(dǎo)到這個(gè)文件。 index.php
文件代碼并不多,但是,這里是加載框架其它部分的起點(diǎn)。
index.php
文件加載 Composer 生成的自動(dòng)加載設(shè)置,然后從 bootstrap/app.php
腳本中檢索 Laravel 應(yīng)用程序的實(shí)例。 Laravel 本身采取的第一個(gè)動(dòng)作是創(chuàng)建一個(gè)應(yīng)用程序 / 服務(wù)容器。
HTTP / Console 內(nèi)核
接下來(lái), 根據(jù)進(jìn)入應(yīng)用程序的請(qǐng)求類型來(lái)將傳入的請(qǐng)求發(fā)送到 HTTP 內(nèi)核或控制臺(tái)內(nèi)核。而這兩個(gè)內(nèi)核是用來(lái)作為所有請(qǐng)求都要通過(guò)的中心位置。 現(xiàn)在,我們先看看位于 app/Http/Kernel.php
中的 HTTP 內(nèi)核。
HTTP 內(nèi)核繼承了 Illuminate\Foundation\Http\Kernel
類,該類定義了一個(gè) bootstrappers
數(shù)組。 這個(gè)數(shù)組中的類在請(qǐng)求被執(zhí)行前運(yùn)行,這些 bootstrappers 配置了錯(cuò)誤處理, 日志, 檢測(cè)應(yīng)用環(huán)境,以及其它在請(qǐng)求被處理前需要執(zhí)行的任務(wù)。
HTTP 內(nèi)核還定義了所有請(qǐng)求被應(yīng)用程序處理之前必須經(jīng)過(guò)的 HTTP 中間件 ,這些中間件處理 HTTP 會(huì)話 讀寫(xiě)、判斷應(yīng)用是否處于維護(hù)模式、 驗(yàn)證 CSRF 令牌 等等。
HTTP 內(nèi)核的 handle
方法簽名相當(dāng)簡(jiǎn)單:獲取一個(gè) Request
,返回一個(gè) Response
??梢园言搩?nèi)核想象作一個(gè)代表整個(gè)應(yīng)用的大黑盒子,輸入 HTTP 請(qǐng)求,返回 HTTP 響應(yīng)。
服務(wù)提供者
內(nèi)核啟動(dòng)操作中最重要的便是你應(yīng)用的 服務(wù)提供者 了。所有應(yīng)用下的服務(wù)提供者均配置到了 config/app.php
配置文件中的 providers
數(shù)組中。 第一步,所有服務(wù)提供者的 register
方法會(huì)被調(diào)用,然后一旦所有服務(wù)提供者均注冊(cè)后, boot
方法才被調(diào)用。
服務(wù)提供者給予框架開(kāi)啟多種多樣的組件,像數(shù)據(jù)庫(kù),隊(duì)列,驗(yàn)證器,以及路由組件。只要被啟動(dòng)服務(wù)提供者就可支配框架的所有功能,所以服務(wù)提供者也是 Laravel 整個(gè)引導(dǎo)周期最重要組成部分。
請(qǐng)求調(diào)度
一旦啟動(dòng)且所有服務(wù)提供者被注冊(cè),Request
會(huì)被遞送給路由。路由將會(huì)調(diào)度請(qǐng)求,交給綁定的路由或控制器,也當(dāng)然包括路由綁定的中間件。
聚焦服務(wù)提供者
服務(wù)提供者是 Laravel 真正意義的生命周期中的關(guān)鍵。應(yīng)用實(shí)例一旦創(chuàng)建,服務(wù)提供者就被注冊(cè),然后請(qǐng)求被啟動(dòng)的應(yīng)用接管。簡(jiǎn)單吧!
牢牢掌握服務(wù)提供者的構(gòu)建和其對(duì) Laravel 應(yīng)用處理機(jī)制的原理是非常有價(jià)值的。當(dāng)然,你的應(yīng)用默認(rèn)的服務(wù)提供會(huì)存放在 app/Providers
下面。
默認(rèn)的, AppServiceProvider
是空白的。這個(gè)提供者是一個(gè)不錯(cuò)的位置,用于你添加應(yīng)用自身的引導(dǎo)處理和服務(wù)容器綁定。當(dāng)然,大型項(xiàng)目中,你可能希望創(chuàng)建數(shù)個(gè)粒度更精細(xì)的服務(wù)提供者。