PHP程序员站--PHP编程开发平台
 当前位置:主页 >> PHP高级编程 >> 高级应用 >> 

PHP设计模式介绍 第十七章 MVC 模式

PHP设计模式介绍 第十七章 MVC 模式

来源:互联网  作者:  发布时间:2010-05-22
web应用是十分多样化的,为了实现某种应用,那哪种或哪些是最好

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设计模式介绍 第六章 伪对象模式


PHP设计模式介绍 第七章 策略模式
PHP设计模式介绍 第八章 迭代器模式
PHP设计模式介绍 第九章 观测模式
PHP设计模式介绍 第十章 规范模式
PHP设计模式介绍 第十一章 代理模式
PHP设计模式介绍 第十二章 装饰器模式
PHP设计模式介绍 第十三章 适配器模式
PHP设计模式介绍 第十四章 动态记录模式
PHP设计模式介绍 第十五章 表数据网关模式
PHP设计模式介绍 第十六章 数据映射模式

Tags: php   设计模式   MVC模式   设计   MVC   模式   C  
最新文章
推荐阅读
月点击排行榜
PHP程序员站 Copyright © 2007-2010,PHPERZ.COM All Rights Reserved 粤ICP备07503606号