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