一直在用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,它也是一种模型,你能够细读下这个,想一想看。
说道底,关键在于抽象,多理解概念,脑壳中套用琢磨下就清楚了。
注:这是我本身的思考过程,受限于水平,一些描述可能不许确,有疑问大可指出,一块儿讨论,:)