原文地址:http://www.larryullman.com/2009/10/08/understanding-mvc/
全系列INDEX
翻譯:shadowmydx 轉帖請注明
最近,我計划寫一個系列關於自己在過去幾個月使用的Yii框架(shadowmydx:基於PHP5的一個web開發
框架,詳情自行google)的文章。但在一切開始以前,我認為首先還是需要先介紹一下MVC設計模式:
模型-視圖-控制器。MVC模式(30年前就有鳥)已經成為了框架以及許多各式各樣的應用的首選。MVC模
式主要着眼於分離應用的顯示和內在邏輯,秉承這個原則,你也許就能夠在不影響應用整體運作的前提
下更加輕松的修改或者自定義應用的某個部分。
當然,基本的道理相當得容易理解,但是呢,MVC的實際實現卻是比較難的。換句話說,在你真正開始
寫代碼以前,需要一些時間來掌握這個模式。在這篇文章里,我將從MVC模式分解的各個部分出發,講
解這些部分之間是如何聯系在一起的。在后續的文章中,我將展示這些部分是如何通信的,以及$this
(shadowmydx:php中的this寫法)指針在各個部分中到底表示什么意思。
OK,讓我們開始吧。MVC設計模式將應用划分為三個不同的部分:
- 模型 —— 用來表示數據
- 視圖 —— 就是用戶界面(用戶通過這個撈批同數據交互)
- 控制器 —— 用戶能夠執行的動作 (shadowmydx:此處原文是which are the actions)
我認為最容易理解的部分就是模型了。這是使用和操作數據的部分。模型的一個經典表現形式就是數據
庫的表,在這種情況下,每個模型的實例代表了特定表中的一行數據。注意,如果你有兩個關系表,比
如說雇員和部門,這將表示成兩個不同的模型,而不是一個。你會發現,把你的模型盡可能的原子化是
一個不錯的選擇。(shadowmydx:原文此處是keep your models as atomic as possible,原子化可以
理解為盡可能的不要組合復雜的數據為一個)其次也很重要的是,使用模型是為了操作可變的數據。舉
個例子,如果你的網站有一個的“聯系我們”板塊,盡管用戶不發郵件給你就沒有數據產生,可是我們
仍然需要一個模型來管理這塊數據,以防萬一嘛。模型不僅僅被用於表示數據,而且也經常被用來操作
那些已經被安全輸入程序處理過的用戶提交數據。(shadowmydx:原文舉了個例子,就是消除用戶提交
的數據中的可能成為惡意代碼的部分。)
視圖在web開發中,也是個容易理解的部分。視圖包含了HTML。很多我用過的框架,比如Yii、Zend和
Ruby On Rails,使用一個主要布局頁面來安排其余的頁面結構。其余的視圖頁面則表示了各個方面的
界面,例如表單區域啊,一個記錄的列表啊,或者某個個人的記錄。這些不同的小塊會被放進主要布局
頁面來形成一個完整的頁面輸出。
如果你有一個經典的雇員-部門管理應用,你也許會擁有這些視圖文件:
- 一個雇員頁面的主要布局頁面
- 一個增加&修改雇員數據的表單
- 一個顯示雇員名單的列表
- 一個顯示單個雇員全部信息的區域
這些文件也可能被部門部分的視圖復用,只要在部門部分的主要布局頁面包含其中的某個實體進去就可
以了。
視圖並不僅僅包含HTML,它們還必須有一些php語言(或者其他什么語言)的部分。這些代碼只應該執
行一些非常簡單的任務,例如打印某個變量的值。一個初學者經常犯的錯誤就是把太多的業務邏輯放到
了視圖中來。視圖的目標是把數據組合起來同時產生一個用戶界面,視圖並不應該“思考”得太多。舉
個例子,視圖可以使用一些條件判斷來選擇在什么情況下打印某個變量,或者使用循環語句來打印某個
數組,但是視圖不應該做一些格式化數據或者修改數據之類的工作。假如你有一個在網站上顯示用戶注
冊時長的功能,同時原始的數據來自數據庫(換句話說,模型的一部分)並用其來計算最終顯示在視圖
上的結果。那么,真正的計算應該發生在模型中,而不是視圖中(或者控制器中)。
控制器往往扮演一個在視圖和模型之間粘合劑的角色,當然有時候並沒有那么明顯。(事實上,MVC設
計模式中各個部分的界限往往很容易就被模糊。)正如我之前所說,一個控制器代表了動作:一些由模
型完成的動作和一些由視圖完成的動作。模型動作包括了從數據庫檢索單個記錄或者取得全部記錄,視
圖動作則為對用戶事件的回應:提交表單、載入頁面等等。
將這些部件通過控制器組合在一起時,用戶訪問一個類似 www.example.com/index.php/employee/list
的頁面時,將會引起一個雇員控制器中的“list”動作。這個list動作可能會調用“retrieve all”動
作來從模型中獲取所有的數據。然后,這個控制器將會把數據發送給“list”視圖,那個視圖將會使用
一個循環打印出所有的雇員。
我將會在未來的文章中為大家展示一些真實世界的代碼,請大家期待
(原文完)
