簡介
在「真實世界」中使用工具時,如果你瞭解它的工作原理,就能更自信地使用。開發應用也是同理。當你理解開發工具的運作方式後,就能更從容、更有信心地構建應用。 本頁將從高層次介紹 Laravel 框架的工作原理。全面理解整個框架,可以讓一切不再顯得像「魔法」,從而增強你構建應用的信心。HTTP 請求生命週期
整體流程
起始步驟
Laravel 應用所有請求的入口是public/index.php 檔案。所有請求都會被 Web 伺服器(Apache / Nginx)的配置轉發到該檔案。index.php 本身幾乎沒有程式碼,只是載入框架其餘部分的起點。
index.php 載入 Composer 生成的自動載入器定義,並從 bootstrap/app.php 獲取 Laravel 應用例項。Laravel 首先完成的工作是建立應用/服務容器例項。
HTTP 核心
接著,請求會交給 HTTP 核心(Illuminate\Foundation\Http\Kernel)處理。透過應用例項的 handleRequest 方法進行處理。
HTTP 核心定義了在請求執行前先執行的載入程式(bootstrappers)陣列。這些載入程式會執行以下工作:
- 配置錯誤處理
- 配置日誌
- 檢測應用環境
- 其他在請求處理前所需的任務
handle 方法的簽名很簡單:接收 Request,返回 Response。可以把它想象成代表整個應用的一個大黑盒——把 HTTP 請求扔進去,就會得到 HTTP 響應。
服務提供者
核心在引導過程中最重要的工作之一是載入應用的服務提供者。服務提供者負責引導資料庫、佇列、校驗、路由等框架的各個元件。 Laravel 會遍歷提供者列表,並逐一例項化。例項化完成後,會呼叫所有提供者的register 方法。之後,當所有提供者都註冊完畢,再依次呼叫它們的 boot 方法。這樣一來,boot 方法執行時,所有容器繫結都已經就緒可用。
使用者自定義或第三方服務提供者需要在
bootstrap/providers.php 檔案中註冊。路由
應用完成引導且所有服務提供者註冊好後,Request 就會被交給路由器進行排程。路由器把請求派發到路由或控制器,並執行路由特定的中介軟體。
中介軟體為過濾或檢查進入應用的 HTTP 請求提供了一種便利機制。例如,Laravel 內建了判斷使用者是否已認證的中介軟體。若使用者未認證,該中介軟體會重定向到登入頁面;若已認證,則允許請求繼續進入應用內部。
請求透過所有匹配到的路由所對應的中介軟體後,路由或控制器方法就會執行並返回響應。
返回響應
當路由或控制器方法返回響應後,響應又會經過路由中介軟體從內向外傳遞,為應用提供在響應發出前進行修改或檢查的機會。 最終響應透過所有中介軟體後,HTTP 核心handle 方法會將響應物件返回給應用例項的 handleRequest,該方法再呼叫響應的 send 方法。send 方法把響應內容傳送到使用者的瀏覽器。至此,Laravel 請求生命週期的整個旅程就完成了。
Console 命令生命週期
整體流程
artisan 入口
控制檯命令的入口是專案根目錄的artisan 檔案。與 HTTP 請求類似,它同樣會載入 Composer 的自動載入器並建立 Laravel 應用例項。
接著,處理會透過應用例項的 handleCommand 方法交給控制檯核心。
控制檯核心與命令執行
控制檯核心和 HTTP 核心一樣,也會載入服務提供者。當所有提供者被註冊並啟動後,Laravel 會載入app/Console/Commands 目錄中的命令並執行你指定的命令。
artisan載入 Composer 自動載入器- 從
bootstrap/app.php建立應用例項 - 控制檯核心載入服務提供者
- 查詢並執行
make:controller命令 - 返回退出碼
關注服務提供者
服務提供者是引導 Laravel 應用的真正關鍵。應用例項建立、服務提供者註冊、請求交給已引導的應用——僅此而已。 深入理解 Laravel 應用如何藉助服務提供者被構建與啟動是非常有價值的。使用者自定義的服務提供者儲存在應用的app/Providers 目錄下。
預設的
AppServiceProvider 幾乎是空的。它非常適合放入應用自身的引導邏輯與服務容器繫結。在大型應用中,我們建議按不同服務將啟動邏輯拆分為多個服務提供者。register 與 boot 的區別
服務提供者有兩個主要方法。下一步
服務容器
理解依賴注入與服務容器的工作原理。
服務提供者
學習如何使用服務提供者引導應用。