簡介 (Introduction)
在「現實世界」中使用任何工具時,如果您了解該工具的運作方式,您會感到更有信心。應用程式開發也不例外。當您了解開發工具的功能時,您會感到更自在並更有信心地使用它們。
本文件的目標是讓您對 Laravel 框架的運作方式有一個良好的、高層次的概覽。透過更了解整體框架,一切都會感覺不再那麼「神奇」,您將更有信心地建立您的應用程式。如果您不能立即理解所有術語,請不要灰心!試著掌握正在發生的事情的基本概念,隨著您探索文件的其他部分,您的知識將會增長。
生命週期概覽 (Lifecycle Overview)
第一步 (First Steps)
所有進入 Laravel 應用程式的請求的入口點都是 public/index.php 檔案。您的 Web 伺服器 (Apache / Nginx) 設定將所有請求導向此檔案。index.php 檔案不包含太多程式碼。相反,它是載入框架其餘部分的起點。
index.php 檔案載入 Composer 生成的自動載入定義,然後從 bootstrap/app.php 檢索 Laravel 應用程式的實例。Laravel 本身採取的第一個動作是建立應用程式 / Service Container 的實例。
HTTP / Console Kernels
接下來,傳入的請求會使用應用程式實例的 handleRequest 或 handleCommand 方法發送到 HTTP Kernel 或 Console Kernel,具體取決於進入應用程式的請求類型。這兩個 Kernels 作為所有請求流經的中心位置。現在,讓我們只關注 HTTP Kernel,它是 Illuminate\Foundation\Http\Kernel 的實例。
HTTP Kernel 定義了一個 bootstrappers 陣列,這些 bootstrappers 將在請求執行之前執行。這些 bootstrappers 設定錯誤處理、設定日誌記錄、偵測應用程式環境,並執行在實際處理請求之前需要完成的其他任務。通常,這些類別處理您不需要擔心的內部 Laravel 設定。
HTTP Kernel 還負責將請求傳遞給應用程式的 Middleware 堆疊。這些 Middleware 處理讀取和寫入 HTTP Session、判斷應用程式是否處於維護模式、驗證 CSRF Token 等等。我們很快就會詳細討論這些。
HTTP Kernel 的 handle 方法的方法簽章非常簡單:它接收一個 Request 並返回一個 Response。將 Kernel 想像成一個代表整個應用程式的大黑盒子。給它 HTTP 請求,它就會返回 HTTP 回應。
Service Providers
最重要的 Kernel 啟動動作之一是載入應用程式的 Service Providers。Service Providers 負責啟動框架的所有各種組件,例如資料庫、Queue、驗證和路由組件。
Laravel 將遍歷此 Providers 清單並實例化每個 Provider。實例化 Providers 後,將在所有 Providers 上呼叫 register 方法。然後,一旦所有 Providers 都已註冊,將在每個 Provider 上呼叫 boot 方法。這樣 Service Providers 就可以依賴於在執行其 boot 方法時已註冊並可用的每個 Container 綁定。
基本上,Laravel 提供的每個主要功能都是由 Service Provider 啟動和設定的。由於它們啟動和設定了框架提供的如此多功能,因此 Service Providers 是整個 Laravel 啟動過程中最重要的一環。
雖然框架內部使用了數十個 Service Providers,但您也可以選擇建立自己的 Service Providers。您可以在 bootstrap/providers.php 檔案中找到應用程式正在使用的使用者定義或第三方 Service Providers 的清單。
路由 (Routing)
一旦應用程式啟動並且所有 Service Providers 都已註冊,Request 將被移交給 Router 進行調度。Router 將把請求調度到路由或 Controller,以及執行任何特定於路由的 Middleware。
Middleware 提供了一種方便的機制來過濾或檢查進入應用程式的 HTTP 請求。例如,Laravel 包含一個驗證應用程式使用者是否已通過驗證的 Middleware。如果使用者未通過驗證,Middleware 會將使用者重新導向到登入畫面。但是,如果使用者已通過驗證,Middleware 將允許請求進一步進入應用程式。有些 Middleware 分配給應用程式內的所有路由,如 PreventRequestsDuringMaintenance,而有些則僅分配給特定路由或路由群組。您可以透過閱讀完整的 Middleware 文件 來了解有關 Middleware 的更多資訊。
如果請求通過了所有符合的路由分配的 Middleware,則將執行路由或 Controller 方法,並且路由或 Controller 方法返回的回應將透過路由的 Middleware 鏈送回。
完成 (Finishing Up)
一旦路由或 Controller 方法返回回應,回應將向外傳回透過路由的 Middleware,讓應用程式有機會修改或檢查傳出的回應。
最後,一旦回應傳回透過 Middleware,HTTP Kernel 的 handle 方法將回應物件返回給應用程式實例的 handleRequest,此方法呼叫返回的回應上的 send 方法。send 方法將回應內容發送給使用者的網頁瀏覽器。我們現在已經完成了整個 Laravel 請求生命週期的旅程!
聚焦 Service Providers (Focus On Service Providers)
Service Providers 確實是啟動 Laravel 應用程式的關鍵。建立應用程式實例,註冊 Service Providers,並將請求移交給已啟動的應用程式。真的就這麼簡單!
牢固掌握 Laravel 應用程式是如何透過 Service Providers 建立和啟動的是非常有價值的。您的應用程式的使用者定義 Service Providers 儲存在 app/Providers 目錄中。
預設情況下,AppServiceProvider 相當空。此 Provider 是新增應用程式自己的啟動和 Service Container 綁定的一個好地方。對於大型應用程式,您可能希望建立幾個 Service Providers,每個都針對應用程式使用的特定服務進行更細粒度的啟動。