# 架構 —— 一次請求的生命周期
## 1、簡介
當我們使用現實世界中的任何工具時,如果理解了該工具的工作原理,那么用起來就會得心應手,應用開發也是如此。當你理解了開發工具如何工作,用起來就會更加游刃有余。
本文檔的目標就是從一個更好、更高層面向你闡述Laravel框架的工作原理。通過對框架更全面的了解,一切都不再那么神秘,你將會更加自信的構建應用。
如果你不能馬上理解所有這些條款,不要失去信心!先試著掌握一些基本的東西,你的知識將會隨著對本文檔的探索而不斷提高。
## 2、生命周期概覽
### 2.1 第一件事
Laravel應用的所有請求入口都是`public/index.php`文件,所有請求都會被web服務器(Apache/Nginx)導向這個文件。`index.php`文件包含的代碼并不多,但是,這里是加載框架其它部分的起點。
`index.php`文件載入Composer生成的自動加載設置,然后從`bootstrap/app.php`腳本獲取Laravel應用實例,Laravel的第一個動作就是創建服務容器實例。
### 2.2?HTTP/Console?內核
接下來,請求被發送到HTTP內核或Console內核,這取決于進入應用的請求類型。這兩個內核是所有請求都要經過的中央處理器,現在,就讓我們聚焦在位于`app/Http/Kernel.php`的HTTP內核。
HTTP內核繼承自`Illuminate\Foundation\Http\Kernel`類,該類定義了一個`bootstrappers`數組,這個數組中的類在請求被執行前運行,這些`bootstrappers`配置了錯誤處理、日志、檢測應用環境以及其它在請求被處理前需要執行的任務。
HTTP內核還定義了一系列所有請求在處理前需要經過的HTTP中間件,這些中間件處理HTTP會話的讀寫、判斷應用是否處于維護模式、驗證CSRF令牌等等。
HTTP內核的標志性方法handle處理的邏輯相當簡單:獲取一個Request,返回一個Response,把該內核想象作一個代表整個應用的大黑盒子,輸入HTTP請求,返回HTTP響應。
### 2.2.1?服務提供者
內核啟動過程中最重要的動作之一就是為應用載入服務提供者,應用的所有服務提供者都被配置在`config/app.php`配置文件的`providers`數組中。首先,所有提供者的`register`方法被調用,然后,所有提供者被注冊之后,`boot`方法被調用。
服務提供者負責啟動框架的所有各種各樣的組件,比如數據庫、隊列、驗證器,以及路由組件等,正是因為他們啟動并配置了框架提供的所有特性,服務提供者是整個Laravel啟動過程中最重要的部分。
### 2.2.2 分發請求
一旦應用被啟動并且所有的服務提供者被注冊,Request將會被交給路由器進行分發,路由器將會分發請求到路由或控制器,同時運行所有路由指定的中間件。
## 3、聚焦服務提供者
服務提供者是啟動Laravel應用中最關鍵的部分,應用實例被創建后,服務提供者被注冊,請求被交給啟動后的應用進行處理,整個過程就是這么簡單!
對Laravel應用如何通過服務提供者構建和啟動有一個牢固的掌握非常有價值,當然,應用默認的服務提供者存放在`app/Providers`目錄下。
默認情況下,`AppServiceProvider`是空的,這里是添加自定義啟動和服務容器綁定的最佳位置,當然,對大型應用,你可能希望創建多個服務提供者,每一個都有著更加細粒度的啟動。
- 前言
- 序言
- 序言 ―― 發行版本說明
- 序言 ―― 升級指南
- 序言 ―― 貢獻代碼
- 開始
- 開始 ―― 安裝及配置
- 開始 ―― Laravel Homestead
- 基礎
- 基礎 ―― HTTP路由
- 基礎 ―― HTTP 中間件
- 基礎 ―― HTTP 控制器
- 基礎 ―― HTTP 請求
- 基礎 ―― HTTP 響應
- 基礎 ―― 視圖
- 基礎 ―― Blade模板
- 架構
- 架構 ―― 一次請求的生命周期
- 架構 ―― 應用目錄結構
- 架構 ―― 服務提供者
- 架構 ―― 服務容器
- 架構 ―― 契約
- 架構 ―― 門面
- 數據庫
- 數據庫 ―― 起步
- 數據庫 ―― 查詢構建器
- 數據庫 ―― 遷移
- 數據庫 ―― 填充數據
- Eloquent ORM
- Eloquent ORM ―― 起步
- Eloquent ORM ―― 關聯關系
- Eloquent ORM ―― 集合
- Eloquent ORM ―― 調整器
- Eloquent ORM ―― 序列化
- 服務
- 服務 ―― 用戶認證
- 服務 ―― Artisan 控制臺
- 服務 ―― Laravel Cashier(交易)
- 服務 ―― 緩存
- 服務 ―― 集合
- 服務 ―― Laravel Elixir
- 服務 ―― 加密
- 服務 ―― 錯誤&日志
- 服務 ―― 事件
- 服務 ―― 文件系統/云存儲
- 服務 ―― 哈希
- 服務 ―― 幫助函數
- 服務 ―― 本地化
- 服務 ―― 郵件
- 服務 ―― 包開發
- 服務 ―― 分頁
- 服務 ―― 隊列
- 服務 ―― Redis
- 服務 ―― Session
- 服務 ―― Envoy 任務運行器(SSH任務)
- 服務 ―― 任務調度
- 服務 ―― 測試
- 服務 ―― 驗證