成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Codeigniter 4.0-dev 版源碼學(xué)習(xí)筆記之三——核心文件 Codeigniter.ph

alighters / 669人閱讀

摘要:行,是否強(qiáng)制訪問。行,嘗試處理此次請(qǐng)求,詳細(xì)見方法。至此,的執(zhí)行主流程完畢。小結(jié)是的核心文件,它被調(diào)用后,完成了諸多的主流程操作。此文可以轉(zhuǎn)載,但轉(zhuǎn)載前需要發(fā)郵件到進(jìn)行溝通,未溝通的均視作侵權(quán)。

前言

Codeigniter.php 是 CI 4 的核心所在,在這里接收并處理了 request 請(qǐng)求,安全檢查,緩存處理, URL 解析以及路由匹配,執(zhí)行過濾器,加載運(yùn)行 Controller ,組裝 repsonse 響應(yīng)并發(fā)送等。

首先扔一張流程圖,后續(xù)我們將開始介紹整個(gè)大致流程:

注:因源碼較長,不再完完整截圖,僅截圖關(guān)鍵位置,并直接使用源碼文件中的行號(hào)作為導(dǎo)引。

run() 方法:

run 方法是在 Codeigniter 初始化后由 index.php 調(diào)用的,可以稱作為核心的入口。

185 行,開始基準(zhǔn)點(diǎn),用于記錄程序執(zhí)行耗時(shí)。

187 行,獲取 request 信息。通過 service 容器機(jī)制加載了 CodeIgniterHTTPIncomingRequest 讀取處理了HTTP method 、 URI 、 Headers 、 Message body 等信息。

188 行,初始化 response ,用于發(fā)送信息給瀏覽器。

190 行,是否強(qiáng)制 https 訪問。

194,185 行,處理緩存。

197 行,檢測(cè)post中是否有 _method 字段重新定義了 http 請(qǐng)求方法。該特性主要用于 Restful 特性時(shí)重定義瀏覽器不支持的 put 、 delete 等特性。

200 行,嘗試處理此次請(qǐng)求,詳細(xì)見 handleRuest() 方法。

之后這些行主要處理在發(fā)生解析等一些錯(cuò)誤時(shí)應(yīng)對(duì)方法。

handleRuest() 方法

該方法找到并執(zhí)行 controller 并把執(zhí)行后得到的 response 內(nèi)容發(fā)給瀏覽器。

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

236-241 行,解析并執(zhí)行過濾器,過濾器可想像成之前版本的鉤子,用于在某些特定的動(dòng)作點(diǎn)之前或者之后執(zhí)行一些自定義代碼。

243 行,劃重點(diǎn),開始涉及到 controller 了。本行執(zhí)行了 startController 方法,看起來是已經(jīng)執(zhí)行了 controller ,但實(shí)際上這個(gè)更像是 before Controller ,只有 Controller 是一個(gè)閉包的時(shí)候才直接執(zhí)行了,如果不是閉包,那么這個(gè)方法僅僅做了一些檢測(cè)工作,判斷當(dāng)前 Controller 存不存在等。

248 行, createController 方法執(zhí)行了如下代碼: new $this->controller($this->request, $this->response) ,可見常規(guī)的 controller 對(duì)象此時(shí)才出現(xiàn)。

251 行,調(diào)用了 post_controller_constructor 事件,但是源碼中的注釋又提到了 hook 。個(gè)人覺得有時(shí)可以把 hook 、 event 、 filter 放在一起分析,它們很相似不是嗎。

253 行,run 了 controller 此時(shí)是真正執(zhí)行了自定義的 controller 。CI 4 中的 view 機(jī)制不再是 load 方式,而是和 laravel 一樣的 return 方式,在 controller 里僅僅是生成了 view 的字符串并 return 回 codeigniter 核心對(duì)象,由核心對(duì)象來繼續(xù)處理。

264 行,gatherOutput 通過 ob_* 系函數(shù)收集輸出內(nèi)容。

267 行,執(zhí)行了 after 的過濾器。

280 行,發(fā)送信息到瀏覽器。

tryToRouteIt() 方法

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

590-592 行,讀取配置文件里的自定義路由。路由的配置與之前版本有了小小的變動(dòng)。具體到路由章節(jié)深入分析。

596 行,拿到 route 對(duì)象。具體路由邏輯都在這個(gè)對(duì)象里。

598 行,處理 cli 與 web 下不同的路徑形式。

603 行,從此處開始收集輸出信息 (view) 。

605 行,拿到 controller ,此處僅僅是找到 controller 的位置。具體如何拿到,后續(xù)會(huì)有相應(yīng)章節(jié)。

606 行,拿到 method ,此處僅僅是找到 method 的位置。具體如何拿到,后續(xù)會(huì)有相應(yīng)章節(jié)。

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

tryToRouteIt 執(zhí)行完畢后將會(huì)返回到 handleRequest ,在 handleRequest 里執(zhí)行了剛剛找到的 controller 和 method 并收集 controller 中 return 回的 view 字符串,通過 gatherOutput 方法拿到輸出,輸出完畢后 handleRequest 返回到 run 方法。 run 方法再返回到 index.php 。至此, CI 的執(zhí)行主流程完畢。

小結(jié)

Codeigniter.php 是 CI 的核心文件,它被 index.php 調(diào)用后,完成了諸多的主流程操作。

下一節(jié)將詳細(xì)看看路由的過程。

此文可以轉(zhuǎn)載,但轉(zhuǎn)載前需要發(fā)郵件到imustgxd*sina.cn進(jìn)行溝通,未溝通的均視作侵權(quán)。
轉(zhuǎn)載同時(shí)需注明原文鏈接 (https://segmentfault.com/a/11... ,并保留此段文字。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/22910.html

相關(guān)文章

  • Codeigniter 4.0-dev 源碼學(xué)習(xí)筆記之一——前言以及 CI 4 預(yù)覽

    摘要:版權(quán)聲明可轉(zhuǎn)載,但不論任何媒體都需要在轉(zhuǎn)載前與本人溝通,并在轉(zhuǎn)載時(shí)注明出處。的各個(gè)核心模塊以模塊名為目錄名分別存儲(chǔ)在這個(gè)目錄下。下一篇文章會(huì)涉及到和。此文可以轉(zhuǎn)載,但轉(zhuǎn)載前需要發(fā)郵件到進(jìn)行溝通,未溝通的均視作侵權(quán)。 寫在前面: 為什么選擇開發(fā)過程中的 CI 4 作為源碼解讀版本:(1)首先我選 CI 是因?yàn)樗暗姆€(wěn)定版都是相對(duì)比較輕量小巧的,而且可以認(rèn)為是簡單的。(2)為什么沒有選...

    MSchumi 評(píng)論0 收藏0
  • Codeigniter 4.0-dev 源碼學(xué)習(xí)筆記之二——入口以及初始化操作

    摘要:通過這個(gè)函數(shù)可以很方便的在程序運(yùn)行期間執(zhí)行很多常見操作。此文可以轉(zhuǎn)載,但轉(zhuǎn)載前需要發(fā)郵件到進(jìn)行溝通,未溝通的均視作侵權(quán)。 index.php index.php 是整個(gè)框架的入口文件,也就是說所有的請(qǐng)求都要從它這里開始。因?yàn)?index.php 源碼非常簡潔,那么我們直接放一張?jiān)创a截圖,按著截圖說一下源碼。 showImg(https://segmentfault.com/img/re...

    _ivan 評(píng)論0 收藏0
  • Codeigniter 4.0-dev 源碼學(xué)習(xí)筆記之四——詳細(xì)路由過程

    摘要:行,判斷如果為空,那么返回默認(rèn)路由。行,把處理完畢后找到的返回。方法該方法是自動(dòng)按著約定規(guī)則去目錄去找路由的過程。此文可以轉(zhuǎn)載,但轉(zhuǎn)載前需要發(fā)郵件到進(jìn)行溝通,未溝通的均視作侵權(quán)。 前言 我個(gè)人覺得在當(dāng)前 MVC 流行的架構(gòu)下,要想去了解一個(gè)框架,或者是一個(gè)基于此架構(gòu)下的應(yīng)用程序,最好的入手方式就是先看路由,雖然路由不是 MVC 里的任何一個(gè),但是知道了路由的來龍去脈就知道了整個(gè)框架或者...

    NSFish 評(píng)論0 收藏0
  • Codeigniter 4.0-dev 源碼學(xué)習(xí)筆記之五——相對(duì)于 3.x 的變化

    摘要:支持命名空間是沒有支持命名空間的。配置文件不再是簡單數(shù)組了新的配置文件是以對(duì)象組織的,各個(gè)配置以對(duì)象的屬性形式暴露出來。此文可以轉(zhuǎn)載,但轉(zhuǎn)載前需要發(fā)郵件到進(jìn)行溝通,未溝通的均視作侵權(quán)。 前言 CI 為了追上大家的腳步,這次跨了一大步,盡量使用了更多的流行設(shè)計(jì)理念,甚至連 PHP 的支持版本都是從 7 開始起步的。我在之前閱讀源碼的同時(shí)也發(fā)現(xiàn)了很多變化的地方,在此把已經(jīng)發(fā)現(xiàn)的列舉出來,不...

    Youngdze 評(píng)論0 收藏0
  • Codeigniter 4.0-dev 源碼學(xué)習(xí)筆記之六——控制器

    摘要:控制器嚴(yán)格來說,這個(gè)是控制器父類的源碼。在中,控制器僅負(fù)責(zé)接到返回的組裝的頁面字符串,并回核心中,由核心再處理后續(xù)事宜。此文可以轉(zhuǎn)載,但轉(zhuǎn)載前需要發(fā)郵件到進(jìn)行溝通,未溝通的均視作侵權(quán)。 前言 其實(shí)一開始我是很糾結(jié)是否要寫控制器的源碼分析的,因?yàn)榭刂破鞯脑创a太少了,少到你不相信這是一個(gè) MVC 里的一個(gè)重頭。直覺里,大家都覺得控制器作為各個(gè)請(qǐng)求的入口,其后端應(yīng)該有很多很多的代碼支撐才可以...

    asce1885 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<