> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# 請求生命週期

> 介紹 Laravel 應用如何處理 HTTP 請求以及 Console 命令。

## 簡介

在「真實世界」中使用工具時，如果你瞭解它的工作原理，就能更自信地使用。開發應用也是同理。當你理解開發工具的運作方式後，就能更從容、更有信心地構建應用。

本頁將從高層次介紹 Laravel 框架的工作原理。全面理解整個框架，可以讓一切不再顯得像「魔法」，從而增強你構建應用的信心。

## HTTP 請求生命週期

### 整體流程

```mermaid theme={null}
flowchart TD
    A[瀏覽器/HTTP 請求] --> B[public/index.php]
    B --> C[載入 Composer 自動載入器]
    C --> D[bootstrap/app.php]
    D --> E[建立應用例項<br>服務容器]
    E --> F[HTTP 核心]
    F --> G[執行載入程式<br>錯誤處理/日誌/環境檢測]
    G --> H[註冊並啟動服務提供者<br>register → boot]
    H --> I[透過中介軟體棧]
    I --> J[路由]
    J --> K[執行控制器/閉包]
    K --> L[生成響應]
    L --> I
    I --> M[向瀏覽器傳送響應]
```

### 起始步驟

Laravel 應用所有請求的入口是 `public/index.php` 檔案。所有請求都會被 Web 伺服器（Apache / Nginx）的配置轉發到該檔案。`index.php` 本身幾乎沒有程式碼，只是載入框架其餘部分的起點。

`index.php` 載入 Composer 生成的自動載入器定義，並從 `bootstrap/app.php` 獲取 Laravel 應用例項。Laravel 首先完成的工作是建立應用/[服務容器](/zh-TW/service-container)例項。

### HTTP 核心

接著，請求會交給 HTTP 核心（`Illuminate\Foundation\Http\Kernel`）處理。透過應用例項的 `handleRequest` 方法進行處理。

HTTP 核心定義了在請求執行前先執行的**載入程式**（bootstrappers）陣列。這些載入程式會執行以下工作：

* 配置錯誤處理
* 配置日誌
* [檢測應用環境](/zh-TW/installation)
* 其他在請求處理前所需的任務

HTTP 核心還負責讓請求透過應用的中介軟體棧。這些中介軟體會處理 [HTTP Session](/zh-TW/session)的讀寫、判斷應用是否處於維護模式、[校驗 CSRF 令牌](/zh-TW/middleware)等。

HTTP 核心 `handle` 方法的簽名很簡單：接收 `Request`，返回 `Response`。可以把它想象成代表整個應用的一個大黑盒——把 HTTP 請求扔進去，就會得到 HTTP 響應。

### 服務提供者

核心在引導過程中最重要的工作之一是載入應用的[服務提供者](/zh-TW/service-providers)。服務提供者負責引導資料庫、佇列、校驗、路由等框架的各個元件。

Laravel 會遍歷提供者列表，並逐一例項化。例項化完成後，會呼叫所有提供者的 `register` 方法。之後，當所有提供者都註冊完畢，再依次呼叫它們的 `boot` 方法。這樣一來，`boot` 方法執行時，所有容器繫結都已經就緒可用。

<Info>
  使用者自定義或第三方服務提供者需要在 `bootstrap/providers.php` 檔案中註冊。
</Info>

### 路由

應用完成引導且所有服務提供者註冊好後，`Request` 就會被交給路由器進行排程。路由器把請求派發到路由或控制器，並執行路由特定的中介軟體。

中介軟體為過濾或檢查進入應用的 HTTP 請求提供了一種便利機制。例如，Laravel 內建了判斷使用者是否已認證的中介軟體。若使用者未認證，該中介軟體會重定向到登入頁面；若已認證，則允許請求繼續進入應用內部。

請求透過所有匹配到的路由所對應的中介軟體後，路由或控制器方法就會執行並返回響應。

### 返回響應

當路由或控制器方法返回響應後，響應又會經過路由中介軟體從內向外傳遞，為應用提供在響應發出前進行修改或檢查的機會。

最終響應透過所有中介軟體後，HTTP 核心 `handle` 方法會將響應物件返回給應用例項的 `handleRequest`，該方法再呼叫響應的 `send` 方法。`send` 方法把響應內容傳送到使用者的瀏覽器。至此，Laravel 請求生命週期的整個旅程就完成了。

## Console 命令生命週期

### 整體流程

```mermaid theme={null}
flowchart TD
    A[執行 artisan 命令] --> B[artisan]
    B --> C[載入 Composer 自動載入器]
    C --> D[bootstrap/app.php]
    D --> E[建立應用例項<br>服務容器]
    E --> F[控制檯核心<br>handleCommand]
    F --> G[註冊並啟動服務提供者<br>register → boot]
    G --> H[載入命令<br>app/Console/Commands]
    H --> I[執行命令]
    I --> J[返回退出碼]
```

### artisan 入口

控制檯命令的入口是專案根目錄的 `artisan` 檔案。與 HTTP 請求類似，它同樣會載入 Composer 的自動載入器並建立 Laravel 應用例項。

接著，處理會透過應用例項的 `handleCommand` 方法交給控制檯核心。

### 控制檯核心與命令執行

控制檯核心和 HTTP 核心一樣，也會載入服務提供者。當所有提供者被註冊並啟動後，Laravel 會載入 `app/Console/Commands` 目錄中的命令並執行你指定的命令。

```shell theme={null}
php artisan make:controller UserController
```

該命令的處理流程如下：

1. `artisan` 載入 Composer 自動載入器
2. 從 `bootstrap/app.php` 建立應用例項
3. 控制檯核心載入服務提供者
4. 查詢並執行 `make:controller` 命令
5. 返回退出碼

## 關注服務提供者

服務提供者是引導 Laravel 應用的真正關鍵。應用例項建立、服務提供者註冊、請求交給已引導的應用——僅此而已。

深入理解 Laravel 應用如何藉助服務提供者被構建與啟動是非常有價值的。使用者自定義的服務提供者儲存在應用的 `app/Providers` 目錄下。

<Info>
  預設的 `AppServiceProvider` 幾乎是空的。它非常適合放入應用自身的引導邏輯與服務容器繫結。在大型應用中，我們建議按不同服務將啟動邏輯拆分為多個服務提供者。
</Info>

### register 與 boot 的區別

服務提供者有兩個主要方法。

| 方法         | 呼叫時機                    | 用途                       |
| ---------- | ----------------------- | ------------------------ |
| `register` | 所有提供者例項化後，全部依次呼叫        | 僅用於向服務容器註冊繫結             |
| `boot`     | 所有提供者的 `register` 完成後呼叫 | 檢視 Composer、事件監聽器以及其他初始化 |

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

## 下一步

<Card title="服務容器" icon="box" href="/zh-TW/service-container">
  理解依賴注入與服務容器的工作原理。
</Card>

<Card title="服務提供者" icon="plug" href="/zh-TW/service-providers">
  學習如何使用服務提供者引導應用。
</Card>


## Related topics

- [用 Laravel 構建 MCP 伺服器](/zh-TW/advanced/mcp-server.md)
- [Laravel 13 新功能彙總](/zh-TW/blog/laravel-13-new-features.md)
- [什麼是 Laravel](/zh-TW/introduction.md)
- [建立 AI SDK 的自定義 Provider](/zh-TW/advanced/ai-sdk-custom-provider.md)
