MVC模式
开始,上帝就给每个民族一只陶杯,从这杯中,人们饮入了他们的生活。
迪格尔印第安人箴言
我们投入时间和精力来开发程序,主要目标是构建实现既定目标的系统。但是,在大多数场合下,这还远远不够,我们还要使代码易于协作开发。[13]
我们想要干净和聪明的代码,也想要一份经过良好设计的代码库,分享、阅读和部署项目的机制和代码一样重要。
在20世纪70年代,设计模式(Design Pattern)作为一种描述和解决问题的方案提一次被提出。实际上这种想法源自建筑学,而不是计算机科学。在20世纪90年代初,面向对象编程使用了相同的技术来命名和描述软件问题。这方面的经典著作是《设计模式——可复用面向对象软件的基础》。[15]
模式
作为程序员,我们遇到的大部分问题其实都已被其他程序员一再地处理了。模式便是特定环境下同类问题的一种解决方案。[15]
我们在进行Web开发时,会遇到如何处理一个请求?如何将请求数据转换成系统对应的指令?如何获得数据?如何显示结果之类的问题,随着经验的积累,我们或许优雅或许困难地回答了这些问题,并总结出一些非正式的、可在项目中重复使用的解决方案,而这些方案便是模式。
每个模式都描述着一种在我们的环境中一遍又一遍地出现的问题,并描述了对该问题的核心解决方案。以此方式你可以使用该方案多次,而从不需要重复做同样的事情。[16]
MVC模式
MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。三者联系见下图:
MVC模式最早由Trygve Reenskaug在1978年提出,是施乐帕罗奥多研究中心(Xerox PARC)在20世纪80年代为程序语言Smalltalk发明的一种软件设计模式。MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外,此模式通过对复杂度的简化,使程序结构更加直观。软件系统通过对自身基本部分分离的同时也赋予了各个基本部分应有的功能。
控制器 负责转发请求,对请求进行处理。
视图 界面设计人员进行图形界面设计。
模型 程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能)。
其实,这种对工作抽样的分工模式,不仅适用于开发软件,也适用于其他广泛的设计和组织工作。
用PHP简单实现MVC模式
设计思路
为了体现MVC模式将内容和表现相分离的思想,我们创建了controllers目录存放控制器,用models目录存放模型,而用views目录存放视图文件,主入口文件为index.php。
入口
// MVC设计模式练习——入口文件
// 入口文件是唯一一个让用户可以通过浏览器请求的脚本文件,通常是index.php
// 提示信息,方便用户输入
if ( !isset( $_GET['c'] ) or !isset( $_GET['m'] ) )
exit( '必须输入控制器和方法名,格式为index.php?c=xx&m=xx' );
// 取得控制器信息
$c = $_GET['c'];
// 引入控制器文件
require './controllers/' . $c . 'Controller.php';
// 实例化控制器对象
$className = $c . 'Controller';
$controller = new $className;
// 取得方法名
$m = $_GET['m'];
// 执行方法
$controller->$m();
?>
控制器
// MVC模式演示——控制器
class UserController{
public function index(){
echo '这是User控制器的index方法'; //这是直接输出
// 我们还可以将变量传递给视图文件
// 正常情况下,数据来自于用户输入或者数据库,因此,我们要用到模型
include './models/User/UserModel.php';
$model = new UserModel();
// 调用模型中的方法获取数据
$test = $model->getUserInfo();
// 当然,也可以直接在控制器中获得数据
$name = 'PHP语言的MVC模式练习数据,这个数据来自于控制器。';
// 直接将该方法的视图文件包含进来,显示给用户
include './views/User/index.php';
// 注意:相对路径的写法:我们是以index.php作为起点。
}
public function hello( $value='' ){
echo '这是User控制器的hello方法';
}
}
?>
在上面的例子中,我们可以通过如下地址访问User控制器的hello方法:
http://localhost/PHP/10-mvc/index.php?c=User&m=index
视图
这是一个纯粹的HTML文件这是一个视图演示文件,纯粹由HTML书写,很容易学习。
用户信息
你好,<?php echo $username; ?>
在视图中,我们将PHP变量嵌入到HTML文件中,从而实现了内容和表现之间的分离。
模型
class UserModel{
public function getUserInfo(){
return '这是来自UserModel模型的测试字符串数据';
}
}
?>