跳到主要內容

請求生命週期

📝 此頁面為 Laravel 官方文檔的繁體中文翻譯。查看原始英文版本

請求生命週期

簡介

在「現實世界」中使用任何工具時,如果您了解該工具的工作原理,您會更有信心。應用程式開發也不例外。當您了解開發工具的運作方式時,您會更舒適且更有信心地使用它們。

本文檔的目標是為您提供 Laravel 框架運作方式的良好、高層次概述。透過更好地了解整個框架,一切會感覺不那麼「神奇」,您在建立應用程式時也會更有信心。如果您不能立即理解所有術語,不要灰心!只需嘗試掌握基本概念,隨著您探索文檔的其他部分,您的知識會不斷增長。

生命週期概述

第一步

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

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

HTTP / 控制台核心

接下來,傳入的請求根據進入應用程式的請求類型,使用應用程式實例的 handleRequesthandleCommand 方法,被發送到 HTTP 核心或控制台核心。這兩個核心作為所有請求流經的中心位置。目前,讓我們只關注 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 相當空。此提供者是添加應用程式自己的引導和服務容器綁定的好地方。對於大型應用程式,您可能希望建立幾個服務提供者,每個提供者為應用程式使用的特定服務提供更細粒度的引導。