跳到內容

請求生命週期

簡介

當在「真實世界」中使用任何工具時,如果您了解該工具的運作方式,您會感到更有信心。 應用程式開發也沒有什麼不同。 當您了解開發工具的功能時,您會在使用它們時感到更自在和更有信心。

本文檔的目標是讓您對 Laravel 框架的運作方式有一個良好且高階的概述。 透過更好地了解整個框架,一切都感覺不那麼「神奇」,並且您在建置應用程式時會更有信心。 如果您不立即理解所有術語,請不要灰心! 只要嘗試基本掌握正在發生的事情,並且隨著您探索文檔的其他部分,您的知識將會增長。

生命週期總覽

初步步驟

所有對 Laravel 應用程式的請求的進入點都是 public/index.php 檔案。 所有請求都由您的 Web 伺服器 (Apache / Nginx) 設定導向到此檔案。 index.php 檔案不包含太多程式碼。 相反地,它是載入框架其餘部分的起點。

index.php 檔案載入 Composer 產生的自動載入器定義,然後從 bootstrap/app.php 檢索 Laravel 應用程式的實例。 Laravel 本身採取的首要動作是建立應用程式/ 服務容器的實例。

HTTP / Console 核心

接下來,傳入的請求會根據進入應用程式的請求類型,使用應用程式實例的 handleRequesthandleCommand 方法,傳送到 HTTP 核心或 Console 核心。 這兩個核心充當所有請求流經的中心位置。 現在,讓我們只關注 HTTP 核心,它是 Illuminate\Foundation\Http\Kernel 的實例。

HTTP 核心定義了一個 bootstrappers 陣列,它們將在請求執行之前運行。 這些引導程式配置錯誤處理、配置記錄、偵測應用程式環境,並執行在實際處理請求之前需要完成的其他任務。 通常,這些類別處理您無需擔心的 Laravel 內部設定。

HTTP 核心還負責將請求傳遞到應用程式的中介層堆疊。 這些中介層處理讀取和寫入 HTTP session、判斷應用程式是否處於維護模式、驗證 CSRF 令牌等等。 我們稍後將詳細討論這些。

HTTP 核心的 handle 方法的方法簽名非常簡單:它接收一個 Request 並返回一個 Response。 將核心視為一個代表您整個應用程式的黑色大盒子。 向其饋送 HTTP 請求,它將返回 HTTP 回應。

服務提供者

最重要的核心引導動作之一是載入應用程式的服務提供者。 服務提供者負責引導框架的所有各種組件,例如資料庫、佇列、驗證和路由組件。

Laravel 將迭代遍歷此提供者列表並實例化它們中的每一個。 在實例化提供者之後,將在所有提供者上調用 register 方法。 然後,一旦所有提供者都已註冊,將在每個提供者上調用 boot 方法。 這樣做的目的是為了讓服務提供者可以依賴每個容器綁定在它們的 boot 方法執行時都已註冊並可用。

Laravel 提供的幾乎每個主要功能都由服務提供者引導和配置。 由於它們引導和配置了框架提供的如此多的功能,因此服務提供者是整個 Laravel 引導過程中最重要的方面。

雖然框架內部使用數十個服務提供者,但您也可以選擇建立自己的服務提供者。 您可以在 bootstrap/providers.php 檔案中找到應用程式正在使用的使用者定義或第三方服務提供者的列表。

路由

一旦應用程式被引導並且所有服務提供者都已註冊,Request 將被移交給路由器以進行分派。 路由器將把請求分派到路由或控制器,以及運行任何路由特定的中介層。

中介層提供了一種方便的機制來過濾或檢查進入您應用程式的 HTTP 請求。 例如,Laravel 包含一個中介層,用於驗證您的應用程式的使用者是否已通過身份驗證。 如果使用者未通過身份驗證,則中介層會將使用者重定向到登入畫面。 但是,如果使用者已通過身份驗證,則中介層將允許請求進一步進入應用程式。 某些中介層被分配給應用程式內的所有路由,例如 PreventRequestsDuringMaintenance,而有些僅被分配給特定的路由或路由群組。 您可以透過閱讀完整的中介層文檔來了解有關中介層的更多資訊。

如果請求通過所有匹配路由的已分配中介層,則將執行路由或控制器方法,並且路由或控制器方法返回的回應將通過路由的中介層鏈發送回去。

完成

一旦路由或控制器方法返回回應,回應將向外傳回路由的中介層,讓應用程式有機會修改或檢查傳出的回應。

最後,一旦回應傳回中介層,HTTP 核心的 handle 方法會將回應物件返回給應用程式實例的 handleRequest,並且此方法會調用返回回應上的 send 方法。 send 方法將回應內容發送到用戶的 Web 瀏覽器。 我們現在已經完成了整個 Laravel 請求生命週期的旅程!

專注於服務提供者

服務提供者確實是引導 Laravel 應用程式的關鍵。 建立應用程式實例,註冊服務提供者,然後將請求交給引導的應用程式。 就這麼簡單!

牢牢掌握 Laravel 應用程式如何透過服務提供者建置和引導是非常有價值的。 您的應用程式使用者定義的服務提供者儲存在 app/Providers 目錄中。

預設情況下,AppServiceProvider 非常空。 此提供者是新增應用程式自己的引導和服務容器綁定的絕佳位置。 對於大型應用程式,您可能希望建立多個服務提供者,每個服務提供者都為您的應用程式使用的特定服務提供更精細的引導。