請求生命週期
簡介
在“現實世界”中使用任何工具時,如果你理解了它的工作原理,就會更有信心。應用開發也是如此。當你瞭解開發工具的運作方式後,使用它們時會感到更加從容和自信。
本文件的目標是為你提供一個關於 Laravel 框架工作原理的高層概述。透過更好地瞭解整個框架,一切都會變得不再那麼“神奇”,你在構建應用時也會更有底氣。如果你不能立即理解所有術語,也不要氣餒!只需試著對正在發生的事情有一個基本的把握,隨著你深入閱讀文件的其他章節,你的知識體系自然會不斷成長。
生命週期概述
入門指南
Laravel 應用所有請求的入口點是 public/index.php 檔案。所有的請求都會由 Web 伺服器(Apache / Nginx)配置定向到該檔案。index.php 檔案本身包含的程式碼並不多。它主要是作為一個載入框架其餘部分的起點。
index.php 檔案會載入 Composer 生成的自動載入器定義,然後從 bootstrap/app.php 獲取 Laravel 應用例項。Laravel 自身執行的第一個動作是建立應用例項 / 服務容器。
HTTP / Console 核心
接下來,傳入的請求會根據進入應用的請求型別,使用應用例項的 handleRequest 或 handleCommand 方法被髮送到 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 方法將響應內容傳送到使用者的 Web 瀏覽器。至此,我們已經完成了整個 Laravel 請求生命週期的旅程!
聚焦服務提供者
服務提供者確實是引導 Laravel 應用的關鍵。應用例項被建立,服務提供者被註冊,請求被交給已引導的應用。這一切就是這麼簡單!
牢牢掌握 Laravel 應用如何構建以及如何透過服務提供者進行引導非常有價值。你應用中使用者自定義的服務提供者儲存在 app/Providers 目錄中。
預設情況下,AppServiceProvider 是相當空的。這個提供者非常適合新增你應用自己的引導邏輯和服務容器繫結。對於大型應用,你可能希望建立多個服務提供者,每個提供者為應用使用的特定服務提供更細粒度的引導。