對于一個HTTP應(yīng)用來說,從用戶發(fā)起請求到響應(yīng)輸出結(jié)束,大致的標(biāo)準(zhǔn)請求流程如下:
載入Composer
的自動加載autoload
文件
實例化系統(tǒng)應(yīng)用基礎(chǔ)類thinkApp
獲取應(yīng)用目錄等相關(guān)路徑信息
加載全局的服務(wù)提供provider.php
文件
設(shè)置容器實例及應(yīng)用對象實例,確保當(dāng)前容器對象唯一
從容器中獲取HTTP
應(yīng)用類thinkHttp
執(zhí)行HTTP
應(yīng)用類的run
方法啟動一個HTTP
應(yīng)用
獲取當(dāng)前請求對象實例(默認(rèn)為 appRequest
繼承thinkRequest
)保存到容器
執(zhí)行thinkApp
類的初始化方法initialize
加載環(huán)境變量文件.env
和全局初始化文件
加載全局公共文件、系統(tǒng)助手函數(shù)、全局配置文件、全局事件定義和全局服務(wù)定義
判斷應(yīng)用模式(調(diào)試或者部署模式)
監(jiān)聽AppInit
事件
注冊異常處理
服務(wù)注冊
啟動注冊的服務(wù)
加載全局中間件定義
監(jiān)聽HttpRun
事件
執(zhí)行全局中間件
執(zhí)行路由調(diào)度(Route
類dispatch
方法)
如果開啟路由則檢查路由緩存
加載路由定義
監(jiān)聽RouteLoaded
事件
如果開啟注解路由則檢測注解路由
路由檢測(中間流程很復(fù)雜 略)
路由調(diào)度對象think
outeDispatch
初始化
設(shè)置當(dāng)前請求的控制器和操作名
注冊路由中間件
綁定數(shù)據(jù)模型
設(shè)置路由額外參數(shù)
執(zhí)行數(shù)據(jù)自動驗證
執(zhí)行路由調(diào)度子類的exec
方法返回響應(yīng)thinkResponse
對象
獲取當(dāng)前請求的控制器對象實例
利用反射機(jī)制注冊控制器中間件
執(zhí)行控制器方法以及前后置中間件
執(zhí)行當(dāng)前響應(yīng)對象的send
方法輸出
執(zhí)行HTTP應(yīng)用對象的end
方法善后
監(jiān)聽HttpEnd
事件
執(zhí)行中間件的end
回調(diào)
寫入當(dāng)前請求的日志信息
至此,當(dāng)前請求流程結(jié)束。