Skip to main content

簡介

在「真實世界」中使用工具時,如果你瞭解它的工作原理,就能更自信地使用。開發應用也是同理。當你理解開發工具的運作方式後,就能更從容、更有信心地構建應用。 本頁將從高層次介紹 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)陣列。這些載入程式會執行以下工作:
  • 配置錯誤處理
  • 配置日誌
  • 檢測應用環境
  • 其他在請求處理前所需的任務
HTTP 核心還負責讓請求透過應用的中介軟體棧。這些中介軟體會處理 HTTP Session的讀寫、判斷應用是否處於維護模式、校驗 CSRF 令牌等。 HTTP 核心 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 目錄中的命令並執行你指定的命令。
該命令的處理流程如下:
  1. artisan 載入 Composer 自動載入器
  2. bootstrap/app.php 建立應用例項
  3. 控制檯核心載入服務提供者
  4. 查詢並執行 make:controller 命令
  5. 返回退出碼

關注服務提供者

服務提供者是引導 Laravel 應用的真正關鍵。應用例項建立、服務提供者註冊、請求交給已引導的應用——僅此而已。 深入理解 Laravel 應用如何藉助服務提供者被構建與啟動是非常有價值的。使用者自定義的服務提供者儲存在應用的 app/Providers 目錄下。
預設的 AppServiceProvider 幾乎是空的。它非常適合放入應用自身的引導邏輯與服務容器繫結。在大型應用中,我們建議按不同服務將啟動邏輯拆分為多個服務提供者。

register 與 boot 的區別

服務提供者有兩個主要方法。
不要在 register 方法中註冊事件監聽器、路由或其他功能。這可能會不小心使用了尚未載入的服務提供者所提供的服務。

下一步

服務容器

理解依賴注入與服務容器的工作原理。

服務提供者

學習如何使用服務提供者引導應用。
最後修改於 2026年7月31日