Codeigniter 4.0-dev 版源码学习笔记之六——控制器
前言
其實(shí)一開始我是很糾結(jié)是否要寫控制器的源碼分析的,因?yàn)榭刂破鞯脑创a太少了,少到你不相信這是一個(gè) MVC 里的一個(gè)重頭。直覺里,大家都覺得控制器作為各個(gè)請(qǐng)求的“入口”,其后端應(yīng)該有很多很多的代碼支撐才可以的,然而事實(shí)相反,去掉注釋后,一共才 60 行左右。
控制器之前
看控制器源碼之前,我們還是要回顧一下,控制器是怎么來的。
請(qǐng)大家看截圖,截圖中有兩個(gè)方法:分別是 createController 和 runController。
createController 負(fù)責(zé)把路由找到的 controller 類實(shí)例化。實(shí)例化時(shí),可以看到 request 和 response 作為參數(shù)傳遞給了 controller 的構(gòu)造方法,這也是為什么在定義 controller 時(shí),如果定義了 __construct 方法一定要記得調(diào)用一下 parent::__construct() ,因?yàn)槟J(rèn)定義了 __construct 方法后會(huì)覆蓋了父類的 __construct ,所以必須明確調(diào)用父類構(gòu)造方法才能執(zhí)行。
runController 是執(zhí)行控制器過程,大致思路就是把剛剛實(shí)例話的對(duì)象拿過來,執(zhí)行路由中找到的控制器方法。并且把輸出返回。
控制器
嚴(yán)格來說,這個(gè)是控制器父類的源碼。為控制器運(yùn)行期間定義了一些常用的方法,如 post 參數(shù)驗(yàn)證,緩存等。下面具體說一下:
11-16 行:控制器父類的屬性,這些屬性可以定義控制器本身的狀態(tài)。可以在自己定義的類中覆蓋掉這些屬性。 helpers 定義要加載的輔助方法,forceHTTPS 大于 0 時(shí),可以指定當(dāng)前設(shè)定值期間內(nèi)強(qiáng)制到 https 。 validator 定義要驗(yàn)證的 post 內(nèi)容的規(guī)則。
18-29 行:控制器父類的構(gòu)造方法,在定義控制器時(shí)如果沒定義自己的構(gòu)造方法,這個(gè)方法會(huì)被默認(rèn)執(zhí)行,如果定義過將會(huì)覆蓋掉這個(gè)方法,需要在構(gòu)造方法的最前邊執(zhí)行 parent::__construct() 以保證這個(gè)方法中的初始化數(shù)據(jù)都能正常初始化。其中 forceHTTPS 方法是強(qiáng)制使用 https 協(xié)議,loadHelpers 可以默認(rèn)自動(dòng)加載需要的 helper 。
51-60 行: validate 方法,主要輔助驗(yàn)證 post 請(qǐng)求過來的各個(gè)字段。形式如下:
以上源碼截取自 CI 4 官方手冊(cè)。如果覺得驗(yàn)證規(guī)則那個(gè)比較亂的話,可以在 ConfigValidation.php 中自定義一個(gè)驗(yàn)證組,并用以下方式驗(yàn)證:
$this->validate($this->request, 'userRules')控制器之后
我們都知道,控制器會(huì)和 view 端交互,在之前的 CI 版本中,控制器會(huì)把 view load 進(jìn)自己的生命周期中,直接處理 request 信息。個(gè)人也覺得這有些把 controller 的地位看得太重了。在 CI 4 中,控制器僅負(fù)責(zé)接到 view 返回的組裝的頁面字符串,并 return 回 codeigniter 核心中,由核心再處理后續(xù)事宜。
結(jié)語
本節(jié)簡單的說了說控制器的父類,源碼比較少,說的也就不多。下一節(jié)試著說說 view 。
此文可以轉(zhuǎn)載,但轉(zhuǎn)載前需要發(fā)郵件到imustgxd*sina.cn進(jìn)行溝通,未溝通的均視作侵權(quán)。 轉(zhuǎn)載同時(shí)需注明鏈接,并保留此段文字。
總結(jié)
以上是生活随笔為你收集整理的Codeigniter 4.0-dev 版源码学习笔记之六——控制器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSS/Compass修改placeho
- 下一篇: ios语音转码