Thinkphp 5.x 應用啟動 App::run()


分析的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請求就結束了!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM