web应用是十分多样化的,为了实现某种应用,那哪种或哪些是最好的呢?或者说,对于web应用有没有一种最好的体系?
问题
你能配置一个单一的web体系去满足每个普通的web应用吗?包括一般性的界面呈现风格,身份验证,表单数据确认等等?
解决方案:
MVC模式把你的软件组织架构分解成3个清晰的任务
model结合了应用数据,应用流程以及业务逻辑
view从model中提取数据并呈现出来
controller调用应用流程,接收输入并传送给model和view
注:MVC的起源
MVC模式是1970年由trygve reenskaug在施乐公司的研究中心提出的。最早的参考例程代码是用smalltalk80编写的。它最初是用来解决应用软件中的用户图形界面的交互问题的。
你要使用了MVC模式,你就会知道它是多么的有用,尤其是对于图形化的用户界面应用。除此之外,MVC对web应用也非常有用,虽然web服务进行通讯连接,与通讯过程有时会中断,但这也带来了一些独特的挑战和机会。
假如你到这一章来寻找一种真正的对于web应用的MVC方法,我希望你不会对于这里的答案太失望。最完美的解决方案是不存在的,但是这里有很多实例以及相关的模式,帮助你有效的去实施MVC。有希望的是,这里的观点能作为你的编码工作的跳板,并且带领你进行更多的研究。
模块视图控制器
不像其他的设计模式,MVC模式不是一个注重于讲述一种可以直接设计编码的类结构的模式。相反,它不仅仅是概念上的指导或范例。
在概念上,MVC模式的定义的是model,view以及controller三者之间的桥梁。controller以及view都依赖于model,因为view和controller都得向model发送数据请求。数据通过controller输入到你的系统当中,并最终通过view显示出结果。对于你一个php开发者,更具体的来说,controller处理每一个外部的http请求,而view将产生http回应。
下边是MVC模式的定义图
在理想的MVC环境中,通讯是直接的,如下面的序列图。
当然,具体到细节上就有些差异了。当在web应用里实施MVC时,在单一的类中不会出现model,view以及controller,MVC把各组对象紧密地连接起来,每组对象实现一种特定的任务。controller可以由几类组成,用来分析http请求,以确定应用程序所要进行的处理动作。model一般是由很多类组成。web应用里的view通常是一种摸版体系,可以由一些对象组成。
在接下来的几节,让我们深入挖掘“MVC三和音”的每个部分,了解哪些设计模式存在于或推动每个部分,以及他们如何帮助你进行编码工作。
Model
model包含你的应用逻辑以及应用数据,它可能是你的应用中最主要的逻辑处理部分。model没有任何关于界面风格的表达,对于处理http请求也没有起什么作用。
Domain Model
域model是对象的一层,它将应用程序处理的问题、数据以及业务逻辑抽象化。域model可以归为两大类:简单域model以及富域model
简单域model在业务对象与数据库表单间产生一对一的响应。你已经见过一些模式--active record,table data gateway,以及datamapper,所有数据库相关的设计模式,他们可以帮助你将数据库相关的逻辑组织成一个域model(为了使本书中的例子合理,简洁易懂,选取的材料都没有超过简单域model的一对一响应的范围---同形映射)
一个富域model包括由一堆紧紧交织在一起的对象构成的复杂的web,这些对象使用了继承机制,本书以及gof当中的很多设计模式都覆盖了这些内容。富域model更容易被测试以及反复重构,外加紧密地和商业需求结合在一起。
采用哪种域model就要看你的应用程序的上下文了。如果你只是传送一个相当简单的表单处理web应用,就没有必要建立富域model了。但是,如果你要编写一个库,那是一个数百万美元市值的公司的内部网的底层结构,那就需要建立一个富域model了,它提供了一个精确的表述业务处理以及迅速的数据计算的平台。
martin fowler致力于开发富域model,简要的覆盖了poeaa中的域模型的类型以及在eric evans的书中的域驱动设计
View
view主要处理所有界面呈现的问题。view从model里提取数据,把它格式化成html页面或者xml页面服务,又或者用于email的文本。
鉴定你是否把你的代码分离成明确定义了的任务的一个好方法就是:尝试代替(至少在概念上)另一个wiew,这个view产生完全不同的输出。举个例子,如果你有一个web应用,为了迅速的使你的web程序在php的命令行模式下运行,你要改动什么呢?
直接通过View中的表单调用Model中的方法去修改数据是不合适的,数据的更新修改方法只能借助Controller来调用。View只能以数据的只读方式调用Model中的方法,不能对数据进行修改。一般情况下有两种View设计模式:Template View和Transform View。
Template View
用于web 应用的view中使用的主要模式就是Template View,这个模式使用一个模版文件(通常是html),它包括了一些特殊标记,当Template View被执行时,这些特殊标记就被model里的对应数据替换并显示出来。
php 本身就是一种特定类型的实例模版,叫做服务器页。一个模版系统是基于使用php作为模版的,它本身是savant(http://www.phpsavant.com/)
延伸阅读:
理解PHP中的MVC编程之MVC框架简介
MVC模式的PHP实现
从魔兽看PHP设计模式
《PHP设计模式介绍》导言
PHP设计模式介绍 第一章 编程惯用法
PHP设计模式介绍 第二章 值对象模式
PHP设计模式介绍 第三章 工厂模式
PHP设计模式介绍 第四章 单件模式
PHP设计模式介绍 第五章 注册模式
PHP设计模式介绍 第六章 伪对象模式