date: 2017-11-21 10:50:00
title: yii 框架簡(jiǎn)析
因?yàn)楣ぷ髟蛐枰厥?yii 框架, 而之前一直使用的 hyperframework -- 公司技術(shù)團(tuán)隊(duì)內(nèi)部開發(fā)的框架, 需要什么服務(wù), 直接往框架上添加即可. hyperframework 底層是服務(wù)容器, 需要添加新的服務(wù)很簡(jiǎn)單, 這個(gè)在我之前的 blog hyperframework WebClient 源碼解讀 / 用 yii 框架 10 分鐘開發(fā) blog 系統(tǒng)? 都有提到, 不熟悉的同學(xué)可以移步一覽. 所以思路上需要做一點(diǎn)改變: yii 已經(jīng)封裝好了很多常用服務(wù), 開箱即用.
PS: 這篇博客的英文版標(biāo)題是
get_yii.md
, 紀(jì)念一下我在 github 上加入的第一個(gè)開源組織以及開源項(xiàng)目 iiYii/getyii. 一晃三年過(guò)去了, 在此對(duì)開源作者表達(dá)誠(chéng)摯敬意!
之前也提到過(guò), 這樣的重型框架之所以入門比較困難, 很大一部分原因是功能太多, 導(dǎo)致難以分清主次和記憶. 這里記憶不是死記硬背, 而是知識(shí)的內(nèi)化, 不過(guò)知識(shí)的內(nèi)化說(shuō)起來(lái)更難以理解, 倒不如說(shuō)是想要達(dá)到知識(shí)隨用隨取信手拈來(lái)的境界, 你起碼得記得吧. 當(dāng)時(shí)也提到一些方法, 這篇 blog 會(huì)進(jìn)行完善并實(shí)踐.
簡(jiǎn)析 yiii 框架的方法(類似的重型框架都可以采用這個(gè)思路):
- 生命周期
- 核心架構(gòu) & 模塊劃分
- 腦圖/筆記 等工具
- 實(shí)踐, 比如開發(fā) blog 系統(tǒng)
生命周期
通過(guò)生命周期來(lái) 解讀源碼/定位問(wèn)題 是非常非常重要的手段. 鳥哥 在他的博客中, 無(wú)論是源碼分析, 還是問(wèn)題解決, 多次實(shí)踐, 這里摘錄 思考能力何其重要.. 中的一段話:
沒(méi)有, 好吧, 如果說(shuō)一定要有, 那就是:vim + grep + “大膽推論,小心驗(yàn)證”, 我知道一個(gè)c寫的可執(zhí)行文件, 是從main開始的, 我知道對(duì)于mod_php來(lái)說(shuō), 開始點(diǎn)必然在apache將控制權(quán)交給它的那一刻開始, 有了這些, 就可以使用vim徜徉在海一樣的代碼中, 而不會(huì)迷路. 有了這些, 不就足夠了么?
yii 框架的生命周期, 雖然在應(yīng)用上會(huì)做如下分類:
- web 應(yīng)用: 一次 http 請(qǐng)求的生命周期, 抽象一點(diǎn)就是 request + response
- console 應(yīng)用: 一次腳本的執(zhí)行過(guò)程.
但是其實(shí)是統(tǒng)一的, 都是對(duì)應(yīng)程序的輸入與輸出(input/output), 只是在 http 請(qǐng)求這里, 使用 request/response 來(lái)表示, 而在后臺(tái)腳本這里, 使用 argument/option 表示輸入, 腳本中直接 echo/print 表示輸出
- php cli life cycle: 仔細(xì)看這張圖, 在執(zhí)行的過(guò)程中, 也有
request
的概念
- 官方供圖 - yii request life cycle: 很明顯的 request / response
核心架構(gòu) & 模塊劃分
- 官方供圖: application structure
這張圖里, 最核心的其實(shí)是: 應(yīng)用主體, 其他部分, 都是通過(guò)應(yīng)用主體來(lái)協(xié)調(diào)調(diào)度, 甚至你可以認(rèn)為, yii = application(container) + component(service)
我制作的 百度腦圖: get_yii, 帶上了標(biāo)識(shí)表示我理解的重要性.
- entry: 入口腳本, 這是一切的開端, 從這里開始可以對(duì)框架有一個(gè)「全景式」的張開
- application(container): 框架的核心, 容器機(jī)制已經(jīng)是現(xiàn)代化框架的代名詞了
- component(service): 框架提供的功能(服務(wù)), 由 application 來(lái)協(xié)調(diào)調(diào)度, 所有可見的功能, 大家經(jīng)常提的 MVC, 其實(shí)也屬于這里
- extension(vendor): 擴(kuò)展(依賴), 雖然需要和框架配合, 可能也需要改造成 component, 但是它的核心理念其實(shí)是 依賴管理, 從而
站在巨人的肩膀上
- concept: 框架需要涵蓋的設(shè)計(jì)理念, 這部分的內(nèi)容希望大家可以好好閱讀, 因?yàn)?可能你一直徜徉在業(yè)務(wù)的海洋, 卻沒(méi)有花時(shí)間思考技術(shù)本身
工具 & 實(shí)踐
熟悉我的同學(xué)可能都知道, 我比較喜歡用 思維導(dǎo)圖, 平時(shí)也喜歡 記筆記, 部分觀點(diǎn)在之前也提到過(guò), 這里再贅述一下:
- 關(guān)于記憶: 知識(shí)的內(nèi)化是需要過(guò)程的, 這個(gè)過(guò)程可以簡(jiǎn)單理解為 記憶, 很多時(shí)候, 其實(shí) 記著了, 也就漸漸掌握了. 所以有時(shí)候大牛會(huì)跟你說(shuō), 下去多看看就行了. 為什么, 因?yàn)槎嗫纯淳褪且粋€(gè)重復(fù)的過(guò)程, 一回生二回熟. 當(dāng)然, 也可以用點(diǎn)文雅的詞 -- 潛移默化
- 筆記: 好記性不如爛筆頭, github 的 gist 來(lái)記代碼片段, 各種筆記應(yīng)用, 這個(gè)就不用多言了吧. 提醒一點(diǎn), 注意清理, 不然最后都是雜草了
- 思維導(dǎo)圖: 開始使用思維導(dǎo)圖的契機(jī)其實(shí)蠻簡(jiǎn)單, 這玩意可以幫助記憶, 當(dāng)時(shí)還特地買了一套書來(lái)看這個(gè). 其實(shí)并沒(méi)有必要特地去研究這個(gè), 我一般這樣的場(chǎng)景下使用 -- 一個(gè)事物太復(fù)雜, 我需要花時(shí)間來(lái)整理清楚它
當(dāng)然還有一些其他的工具, 主要遵循 一圖勝千言 的理念, 比如流程圖, 時(shí)序圖, 這就看場(chǎng)景了, 不過(guò)使用頻率沒(méi)那么高.
關(guān)于實(shí)踐, 我們前任 CTO 的建議我會(huì)一直銘記:
多讀源碼