一直在用MVC模式編程,忽然對其中Model層的定義有些疑惑,要說其它兩層把,一個負責展示的視圖,一個負責流程的控制,清晰明瞭,可是其中的Model又指的什麼呢?php
從字面上理解,都稱其爲模型層,什麼是模型?大多數Model的定義就像這樣git
class User extends Model{ public function add(array $user) { // 新增代碼 } public function delete($id) ... }
Model難道只是個對數據庫增刪查改接口的封裝嗎?還有些人認爲,Model應該是對數據表的映射,它難道是一種ORM的實現?github
MVC概念來自傳統的桌面軟件開發,在那樣的環境下,事件發生時,Model能夠主動通知View,而這在HTTP協議裏是不可能的(長鏈接comet除外啊)。長期以來,PHP業界對MVC框架中M和C的理解和運用都是不精細的(固然,夠用就好,能知足絕大多數業務了)。這致使MC分層不清,PHPer在寫代碼的時候沒有明確的規則,到底業務邏輯放在C裏仍是M裏,常見的問題有:數據庫
C層承擔職責過多,如,贊一個答案是給對應回答者加聲望,寫到C裏面去了編程
M層太單薄,就繼承一下框架的Model(或者DB類),實現數據庫的增刪查改緩存
非數據庫操做(如調用微博OpenAPI)只好包裝到Util類框架
用戶輸入($_GET,$_POST)全局亂跑,M層和Util裏都有spa
因爲大部分場景下,PHP都用來作Web應用,並且是Database Driven Application,因此,各種Database Driven的快速開發框架也應運而生,好比說,CakePHP的Model類乾脆就定義了CURD幾個針對數據表的操做,Qcodo直接根據數據表結構自動生成MVC三層的腳手架代碼。code
我理解的PHP應用是5層結構,M層應再拆分爲Biz Model,DAO,Infrastructure,貼幾頁我4年前講過的PPT吧:
orm
PPT全文下載:"Evolution of Web Application Architectures(ppt2003).ppt" http://vdisk.weibo.com/s/535FV
取決於你項目的規模和複雜程度,若是僅僅是簡單的數據庫CRUD,Model徹底被ORM取代沒什麼問題。
在個人項目中,由於有模塊話以及多種數據來源的複雜性。Model又被細分爲三層:
最上層負責事件調度和緩存調度
中間抽象出一層,我稱之爲ModelItem,一個ModelItem的數據來源多是ORM,也多是來自Webservice,ModelItem之間能夠進行數據與數據間的關係橋接,也就是傳統的One2One,Many2Many等關係,可是這種關係並不限於ORM,而是廣泛適用於全部數據,因此頗有可能一個來自數據庫的數據Product能夠和來自Taobao Webservice的數據進行連接。
最下層是數據接口的底層實現,包括ORM和Webservice。
項目頁:https://github.com/AlloVince/eva-engi...
因此個人結論是:Model的功能包含但並不限於將數據庫抽象爲對象,若是項目簡單,Model能夠等價於ORM,若是複雜,Model最好再細分。
一個應用程序包括應用程序邏輯和業務邏輯。(參考連接:http://www.wo2jia.cn/home/index.php?c...)
應用程序邏輯主要是流程控制,如操做帳戶前要登陸、商品添加到購物車時要檢查購物車是否有空間,這些是放在Controller中的。而業務邏輯是處理數據的邏輯,如往購物車添加商品、從購物車移除商品等。爲了和流程控制分離,咱們就把業務邏輯封裝起來,稱之爲模型(Model)。
那到底什麼是「模型」?依照百科的解釋
人們依據研究的特定目的,在必定的假設條件下,再現原型(antetype)客體的結構、功能、屬性、關係、過程等本質特徵的物質形式或思惟形式。
也就是說模型能夠用來描述原型客體,如等比例的航模能夠「描述」實際的船隻結構和特徵。
業務模型能夠這樣理解,現實中咱們對信息的交換處理,在程序裏能夠用一些結構化的數據來描述。好比你去超市買東西,就有購物車,而後一件件商品往裏面丟,如何抽象爲模型去描述這個業務?首先也要有一個抽象購物車,在程序裏表現形式能夠是一個ShopCart類(OO),而後再有一個Goods類,包含商品信息,而後SC提供了幾個方法操做Goods。這個過程也能夠叫作建模吧。
建模後,數據如何存儲,那就是另一回事了,你能夠存數據庫,也能夠存文件。嚴格來講,模型應該是不知道數據如何存儲的,須要用 Proxy 來解決。關於ORM,它也是一種模型,你能夠細讀下這個,想一想看。
說道底,關鍵在於抽象,多理解概念,腦殼中套用琢磨下就清楚了。
注:這是我本身的思考過程,受限於水平,一些描述可能不許確,有疑問大可指出,一塊兒討論,:)