摘要:行,是否強制訪問。行,嘗試處理此次請求,詳細見方法。至此,的執行主流程完畢。小結是的核心文件,它被調用后,完成了諸多的主流程操作。此文可以轉載,但轉載前需要發郵件到進行溝通,未溝通的均視作侵權。
前言
Codeigniter.php 是 CI 4 的核心所在,在這里接收并處理了 request 請求,安全檢查,緩存處理, URL 解析以及路由匹配,執行過濾器,加載運行 Controller ,組裝 repsonse 響應并發送等。
首先扔一張流程圖,后續我們將開始介紹整個大致流程:
注:因源碼較長,不再完完整截圖,僅截圖關鍵位置,并直接使用源碼文件中的行號作為導引。
run() 方法:run 方法是在 Codeigniter 初始化后由 index.php 調用的,可以稱作為核心的入口。
185 行,開始基準點,用于記錄程序執行耗時。
187 行,獲取 request 信息。通過 service 容器機制加載了 CodeIgniterHTTPIncomingRequest 讀取處理了HTTP method 、 URI 、 Headers 、 Message body 等信息。
188 行,初始化 response ,用于發送信息給瀏覽器。
190 行,是否強制 https 訪問。
194,185 行,處理緩存。
197 行,檢測post中是否有 _method 字段重新定義了 http 請求方法。該特性主要用于 Restful 特性時重定義瀏覽器不支持的 put 、 delete 等特性。
200 行,嘗試處理此次請求,詳細見 handleRuest() 方法。
之后這些行主要處理在發生解析等一些錯誤時應對方法。
handleRuest() 方法該方法找到并執行 controller 并把執行后得到的 response 內容發給瀏覽器。
233 行,解析路由,具體見 tryToRouteIt() 方法
236-241 行,解析并執行過濾器,過濾器可想像成之前版本的鉤子,用于在某些特定的動作點之前或者之后執行一些自定義代碼。
243 行,劃重點,開始涉及到 controller 了。本行執行了 startController 方法,看起來是已經執行了 controller ,但實際上這個更像是 before Controller ,只有 Controller 是一個閉包的時候才直接執行了,如果不是閉包,那么這個方法僅僅做了一些檢測工作,判斷當前 Controller 存不存在等。
248 行, createController 方法執行了如下代碼: new $this->controller($this->request, $this->response) ,可見常規的 controller 對象此時才出現。
251 行,調用了 post_controller_constructor 事件,但是源碼中的注釋又提到了 hook 。個人覺得有時可以把 hook 、 event 、 filter 放在一起分析,它們很相似不是嗎。
253 行,run 了 controller 此時是真正執行了自定義的 controller 。CI 4 中的 view 機制不再是 load 方式,而是和 laravel 一樣的 return 方式,在 controller 里僅僅是生成了 view 的字符串并 return 回 codeigniter 核心對象,由核心對象來繼續處理。
264 行,gatherOutput 通過 ob_* 系函數收集輸出內容。
267 行,執行了 after 的過濾器。
280 行,發送信息到瀏覽器。
tryToRouteIt() 方法該方法主要在 url 信息中找到 controller 在哪里。
590-592 行,讀取配置文件里的自定義路由。路由的配置與之前版本有了小小的變動。具體到路由章節深入分析。
596 行,拿到 route 對象。具體路由邏輯都在這個對象里。
598 行,處理 cli 與 web 下不同的路徑形式。
603 行,從此處開始收集輸出信息 (view) 。
605 行,拿到 controller ,此處僅僅是找到 controller 的位置。具體如何拿到,后續會有相應章節。
606 行,拿到 method ,此處僅僅是找到 method 的位置。具體如何拿到,后續會有相應章節。
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... ,并保留此段文字。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/22910.html
摘要:版權聲明可轉載,但不論任何媒體都需要在轉載前與本人溝通,并在轉載時注明出處。的各個核心模塊以模塊名為目錄名分別存儲在這個目錄下。下一篇文章會涉及到和。此文可以轉載,但轉載前需要發郵件到進行溝通,未溝通的均視作侵權。 寫在前面: 為什么選擇開發過程中的 CI 4 作為源碼解讀版本:(1)首先我選 CI 是因為它之前的穩定版都是相對比較輕量小巧的,而且可以認為是簡單的。(2)為什么沒有選...
摘要:通過這個函數可以很方便的在程序運行期間執行很多常見操作。此文可以轉載,但轉載前需要發郵件到進行溝通,未溝通的均視作侵權。 index.php index.php 是整個框架的入口文件,也就是說所有的請求都要從它這里開始。因為 index.php 源碼非常簡潔,那么我們直接放一張源碼截圖,按著截圖說一下源碼。 showImg(https://segmentfault.com/img/re...
摘要:行,判斷如果為空,那么返回默認路由。行,把處理完畢后找到的返回。方法該方法是自動按著約定規則去目錄去找路由的過程。此文可以轉載,但轉載前需要發郵件到進行溝通,未溝通的均視作侵權。 前言 我個人覺得在當前 MVC 流行的架構下,要想去了解一個框架,或者是一個基于此架構下的應用程序,最好的入手方式就是先看路由,雖然路由不是 MVC 里的任何一個,但是知道了路由的來龍去脈就知道了整個框架或者...
摘要:支持命名空間是沒有支持命名空間的。配置文件不再是簡單數組了新的配置文件是以對象組織的,各個配置以對象的屬性形式暴露出來。此文可以轉載,但轉載前需要發郵件到進行溝通,未溝通的均視作侵權。 前言 CI 為了追上大家的腳步,這次跨了一大步,盡量使用了更多的流行設計理念,甚至連 PHP 的支持版本都是從 7 開始起步的。我在之前閱讀源碼的同時也發現了很多變化的地方,在此把已經發現的列舉出來,不...
摘要:控制器嚴格來說,這個是控制器父類的源碼。在中,控制器僅負責接到返回的組裝的頁面字符串,并回核心中,由核心再處理后續事宜。此文可以轉載,但轉載前需要發郵件到進行溝通,未溝通的均視作侵權。 前言 其實一開始我是很糾結是否要寫控制器的源碼分析的,因為控制器的源碼太少了,少到你不相信這是一個 MVC 里的一個重頭。直覺里,大家都覺得控制器作為各個請求的入口,其后端應該有很多很多的代碼支撐才可以...
閱讀 3981·2021-11-22 15:31
閱讀 2518·2021-11-18 13:20
閱讀 3098·2021-11-15 11:37
閱讀 6956·2021-09-22 15:59
閱讀 736·2021-09-13 10:27
閱讀 3767·2021-09-09 09:33
閱讀 1434·2019-08-30 15:53
閱讀 2562·2019-08-29 15:37