Codeigniter 4.0-dev 版源碼學習筆記之三——核心文件 Codeigniter.php

前言

Codeigniter.php 是 CI 4 的核心所在,在這裏接收並處理了 request 請求,安全檢查,緩存處理, URL 解析以及路由匹配,執行過濾器,加載運行 Controller ,組裝 repsonse 響應併發送等。php

首先扔一張流程圖,後續咱們將開始介紹整個大體流程:laravel

Codeigniter.php 流程圖

注:因源碼較長,再也不完完整截圖,僅截圖關鍵位置,並直接使用源碼文件中的行號做爲導引。web

run() 方法:

run 方法是在 Codeigniter 初始化後由 index.php 調用的,能夠稱做爲核心的入口。segmentfault

run 方法源碼截圖

  1. 185 行,開始基準點,用於記錄程序執行耗時。瀏覽器

  2. 187 行,獲取 request 信息。經過 service 容器機制加載了 CodeIgniterHTTPIncomingRequest 讀取處理了HTTP method 、 URI 、 Headers 、 Message body 等信息。緩存

  3. 188 行,初始化 response ,用於發送信息給瀏覽器。安全

  4. 190 行,是否強制 https 訪問。閉包

  5. 194,185 行,處理緩存。併發

  6. 197 行,檢測post中是否有 _method 字段從新定義了 http 請求方法。該特性主要用於 Restful 特性時重定義瀏覽器不支持的 put 、 delete 等特性。函數

  7. 200 行,嘗試處理這次請求,詳細見 handleRuest() 方法

  8. 以後這些行主要處理在發生解析等一些錯誤時應對方法。

handleRuest() 方法

handleRuest 方法源碼截圖

該方法找到並執行 controller 並把執行後獲得的 response 內容發給瀏覽器。

  1. 233 行,解析路由,具體見 tryToRouteIt() 方法

  2. 236-241 行,解析並執行過濾器,過濾器可想像成以前版本的鉤子,用於在某些特定的動做點以前或者以後執行一些自定義代碼。

  3. 243 行,劃重點,開始涉及到 controller 了。本行執行了 startController 方法,看起來是已經執行了 controller ,但實際上這個更像是 before Controller ,只有 Controller 是一個閉包的時候才直接執行了,若是不是閉包,那麼這個方法僅僅作了一些檢測工做,判斷當前 Controller 存不存在等。

  4. 248 行, createController 方法執行了以下代碼: new $this->controller($this->request, $this->response) ,可見常規的 controller 對象此時纔出現。

  5. 251 行,調用了 post_controller_constructor 事件,可是源碼中的註釋又提到了 hook 。我的以爲有時能夠把 hook 、 event 、 filter 放在一塊兒分析,它們很類似不是嗎。

  6. 253 行,run 了 controller 此時是真正執行了自定義的 controller 。CI 4 中的 view 機制再也不是 load 方式,而是和 laravel 同樣的 return 方式,在 controller 裏僅僅是生成了 view 的字符串並 return 回 codeigniter 核心對象,由核心對象來繼續處理。

  7. 264 行,gatherOutput 經過 ob_* 系函數收集輸出內容。

  8. 267 行,執行了 after 的過濾器。

  9. 280 行,發送信息到瀏覽器。

tryToRouteIt() 方法

該方法主要在 url 信息中找到 controller 在哪裏。

tryToRouteIt 方法源碼截圖

  1. 590-592 行,讀取配置文件裏的自定義路由。路由的配置與以前版本有了小小的變更。具體到路由章節深刻分析。

  2. 596 行,拿到 route 對象。具體路由邏輯都在這個對象裏。

  3. 598 行,處理 cli 與 web 下不一樣的路徑形式。

  4. 603 行,今後處開始收集輸出信息 (view) 。

  5. 605 行,拿到 controller ,此處僅僅是找到 controller 的位置。具體如何拿到,後續會有相應章節。

  6. 606 行,拿到 method ,此處僅僅是找到 method 的位置。具體如何拿到,後續會有相應章節。

  7. 610-613 行,處理國際化問題。

tryToRouteIt 執行完畢後將會返回到 handleRequest ,在 handleRequest 裏執行了剛剛找到的 controller 和 method 並收集 controller 中 return 回的 view 字符串,經過 gatherOutput 方法拿到輸出,輸出完畢後 handleRequest 返回到 run 方法。 run 方法再返回到 index.php 。至此, CI 的執行主流程完畢。

小結

Codeigniter.php 是 CI 的核心文件,它被 index.php 調用後,完成了諸多的主流程操做。

下一節將詳細看看路由的過程。

此文能夠轉載,但轉載前須要發郵件到imustgxd*sina.cn進行溝通,未溝通的均視做侵權。
轉載同時需註明原文連接 (https://segmentfault.com/a/11... ,並保留此段文字。

相關文章
相關標籤/搜索