---
# System prepended metadata

title: Laravel - Request Lifecycle 請求的生命週期
tags: [草稿, '2021', laravel]

---

# Laravel - Request Lifecycle 請求的生命週期

https://laravel.com/docs/8.x/lifecycle

# 第一步

- 進入點是 `public/index.php` 
- 所有請求會直接進入 `public/index.php` 經由你的server (apache nginx)
- index.php 
    - 載入 composer 建立 autoloader
    - 取得所有 instance  從 `bootstrap/app.php`
    - 第一個 instance 是 service container

# HTTP/終端核心

- 下一步是將進來的 request 送到 HTTP kernel 或者 console kernel (基於 request 的種類)，這兩個 kernel 是具有中心地位的

-  HTTP kernel (`app/Http/Kernel.php`)
    - HTTP kernel 繼承 `Illuminate\Foundation\Http\Kernel ` 它定義了一個 bootstrappers  陣列是會在 request  被執行之前跑得
    - 這些 bootstrappers
        - 配置
            - error handling
            - logging
        - detect the application environment
        - 與其它任務是 request 真的被執行之前需要做的
        - 事實上是內部的 Laravel 配置
    - 定義一系列 middleware (所有的 request 必定通過) 
        - 讀取和寫入 HTTP session
        - 決定 application  是否在維護模式
        - 辨識 csrf token
    - HTTP kernel 的簽章方法是 handle ，它接收 request 回傳 response

# Service Providers

- 最重要的 kernel bootstrapping actions 
- 所有的 service providers 配置設定放在 `config/app.php` 
- laravel 會疊代所有這些 providers 和 初始化它們，初始化後 providers 後, register 方法就會被呼叫，當所有的 providers 被註冊後，boot 方法就會被每個 provider 呼叫
- Service Providers 的職責是 初始化所有 framework 的 components
    - database 
    - queue 
    - validation 
    - routing
- 基本上所有的主要 feature 都是 bootstrapped and configured by a service provider

# Routing

- 其中一個最重要的 service providers 是 `App\Providers\RouteServiceProvider`
    - 載入 route files (routes directory )
- 當所有的 sevice providers 被 register 後，Request 將會給 router 做 dispatching
- router 會 dispatch request 到 route 或 controller 與跑任何特定的 middleware
- 當 request 通過所有 middleware 後 method 就會被執行且會被回傳

# Finishing Up

- 當 route or controller method 回傳 response ，response 會回到  route's middleware，給 application 一個機會去修正或驗證回傳的response
- 最後當回傳到 middleware 後，HTTP kernel的 handle method 會回傳 response 物件且 index.php 會呼叫 send method 在回傳的 response 上，send method 傳送response content 給 user web browser，這就是整個laravel 的request life cycle

# Focus On Service Providers

- 預設的 service provider 是放在 `app/Providers` 目錄
- 預設上 AppServiceProvider 是空的，它可以增加你自己 application's  的bootstrapping和 sevice container bindings

###### tags: `2021` `草稿` `laravel`


{%hackmd BJrTq20hE %}
