分析的thinkphp版本為:5.0.24
在上文加載完配置等一系列工作之后,進入App::run(),在run()方法中,
首先通過自動加載機制拿到 Request 的一個實例
接着 $config = self::initCommon()初始化公共配置,先是 addNamespace 添加app當前所在的命名空間,然后 進行 self::init()初始化,跟進去
它會進行加載默認的application下的config.php配置文件、database.php數據庫配置文件
還會讀取額外的application\extra\ 下的配置文件、加載公共文件等等操作
最后又會調用 Config::get(),將其配置參數全部放入到數組中
然后回到 self::initCommon 函數中繼續往下走,就是檢查參數、加載額外需要的文件等等
回到 原來的run函數中繼續往下走,先是進行 模塊/控制器綁定操作,這里默認 BIND_MODULE 沒定義 所以不走
然后往下走來到$dispatch = self::routeCheck($request, $config);
,功能是URL 路由檢測 跟進
進入了,先來到path方法,獲取你的訪問路徑index/index/index
然后接着開始 路由的判斷
默認runtime目錄下沒有路由的緩存文件,然后就就會去包含application目錄下的route.php文件
接着進行路由的檢測 進入到 check 方法中
在check方法中,先對你的路由路徑index/index/index 中的 '/ '進行 '|' 替換處理
接着進入 $request->method 方法中 對該路由請求的方式為哪種類型,最后走的是如下
繼續跟進它會獲取服務器的$_SERVER的變量,然后調用input方法
看起來是獲取 REQUEST_METHOD 中的值
然后又調用 getFilter 方法,來獲取全局過濾的規則
上面獲取完全局過濾的規則之后,就開始進行過濾操作
到這里 又回到了 check方法中,上面完成了 獲取了 請求類型的路由規則 和 http的請求方式 和 請求的路徑
然后接着開始進行 URL綁定,默認為空
這里接着把剛才 | 替換為 /
然后這里就走出了check方法,最后來到了 parseUrl 方法中, 該方法 實現的功能
先進入parseUrlPath這個方法,對 路由方法的分割,比如這里是Index/index/index,那么就如下返回
然后解析 模塊 控制器 動作 以及 所帶的參數
最后返回解析完的數據
到現在 已經是 回到了 app->run 的主方法中 routeCheck 的方法,所以 自己看來可以理解為就是對 路徑的訪問 路由方式的判斷 解析 模塊 控制器 動作 以及 所帶的參數的操作!
到這里在App::run()方法中已經執行了一般了,主要的 initCommon routeCheck 兩個方法都執行過了
現在繼續執行的就是 exec 方法
到目前,前面得了 routeCheck 方法 會把結果放在 $dispatch中
然后進入 exec方法中,該方法會根據 $dispatch['type'] 判斷,這里是 module,那么走 module 的分支 module()方法
module() 該方法主要的操作就是 初始化模塊
來到其中的 init 方法 ,流程就是 先根據模塊 定位模塊的目錄 然后加載 當前模塊目錄下的 config.php文件
然后加載 當前模塊目錄下的 config.php文件
接着讀取數據庫配置文件等等
然后出$request->module方法 重新來到 exec 中module方法 中,接着獲取控制器名
再獲取操作名
再整合 控制器和動作
接着再次獲取動作名
最后開始調用
真正調用Action的函數
最后在exec中返回調用返回來的數據$data
通過該Response創建,然后最后echo
到這里完整的一次http請求就結束了!