跳到內容

請求生命週期

簡介

當您在「現實世界」中使用任何工具時,如果您了解該工具的工作原理,您會感覺更有信心。應用程式開發也是如此。當您了解開發工具的功能時,您會在使用它們時感到更加舒適和自信。

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

生命週期概述

第一步

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

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

HTTP / Console 核心

接下來,根據進入應用程式的請求類型,使用應用程式實例的 handleRequesthandleCommand 方法,將傳入的請求傳送到 HTTP 核心或控制台核心。這兩個核心是所有請求流經的中心位置。現在,我們先專注於 HTTP 核心,它是 Illuminate\Foundation\Http\Kernel 的一個實例。

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

HTTP 核心還負責透過應用程式的中介層堆疊傳遞請求。這些中介層處理讀取和寫入 HTTP 工作階段、判斷應用程式是否處於維護模式、驗證 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 方法會將回應內容傳送到使用者的網路瀏覽器。我們現在已完成整個 Laravel 請求生命週期的旅程!

專注於服務提供者

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

深入理解 Laravel 應用程式如何透過服務提供者 (service providers) 建構和啟動,是非常有價值的。您的應用程式使用者定義的服務提供者儲存在 app/Providers 目錄中。

預設情況下,AppServiceProvider 幾乎是空的。這個提供者是加入您應用程式自身的啟動和服務容器綁定的絕佳位置。對於大型應用程式,您可能會希望建立多個服務提供者,每個服務提供者都為您的應用程式使用的特定服務提供更精細的啟動。