首页 > 扩展 > MVC > 正文

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

2024-09-06 20:44:32
字体:
来源:转载
供稿:网友

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/)

共4页上一页1234下一页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表