【 摘 要 】 mvc是项目中的一种通用框架模式,用于描述程序结构中各部分职责及交互方式,其主要作用就是通过控制层实现模型层和视图层的有效分离。web项目中mvc模式的应用,不仅提高了程序结构的合理性,降低了程序模块之间的耦合性,而且大大提高了程序代码的重用性。
【 关键词 】 mvc;php;模式
1 引言
模式是一种解决某类问题通用的最佳方法,mvc模式是一种解决计算机学科领域内项目中模型层(model)、视图层(view)、控制层(control)三部分有效耦合和内聚的一种通用方法,简单来说就是程序代码的一种组织形式,其主要作用就是通过控制层实现模型层和视图层的有效分离,使得程序员开发生成一个表现丰富、内聚性强、耦合性弱且易于扩展的项目。在基于php的web项目中,mvc模式的应用也非常广泛,虽说web项目中的三层体系结构解决了项目中业务操作过程中代码封装的问题,但和mvc模式还是有着本质区别的,在一个web项目中,两种概念可同时应用亦可单独应用。
2 mvc模式组件构成
在一个web项目中,mvc的三个组件各自分工完成不同任务且又紧密联系形成一个有机不可分割的整体。组件构成及其关系如图1所示。
web项目中,视图即我们通过浏览器看到的页面外观,通常需要html+css的支持,随着web技术的不断更新与升级,视图层通常还包括xhtml、xml、wml等标记语言、客户端的脚本以及通用模板标签。mvc模式下视图层的处理仅仅局限于数据的采集与表现,不包括业务逻辑与流程的数据处理,通常情况下业务逻辑与业务流程交由模型层解决,模型层负责接收视图层发送来的请求数据,并通过一定的业务逻辑处理返回最终结果给客户端浏览器。模型层是mvc模式的核心组成部分,包含了web应用程序应有的功能的实现算法。实际上,mvc模式中并没有提供模型的具体设计方法,只是给出了提高模型重构性和重用性的方法。模型层用于封装与应用程序业务逻辑数据及其处理方法,不依赖视图层和控制器层,即不关心数据如何处理和如何显示,可同时被多个web应用程序视图重用。
控制器层的主要功能则是根据视图层请求的数据判断交由哪个模型来处理,可以用来连接不同的模型和视图去完成用户需求,与模型层和视图层保持相对的独立,提高了web应用程序的灵活性和可配置性。控制器层不对数据进行处理,只是负责将用户请求信息传递给相应模型,然后将模型处理结果选择符合要求的视图呈现给用户。
3 php中mvc模式的应用
根据前文介绍,我们基本了解了web中数据在mvc中的响应、传递及处理过程,即控制器层根据url请求,把相应参数传递给对应的action,然后调用相应模型方法处理进而得到数据,最后选择相应的视图呈现给用户。通常情况下,开发基于php的web项目遵守同样的应用规则,首先建立项目的统一入口文件,然后再建立相应的控制规则及模型功能算法,最后当用户通过视图向服务器发出请求,则会触发对应的action,进而激活相应的模型处理请求,再返回给视图。实际开发中,我们建立如图2所示的文件结构。
3.1 建立mvc框架类
mvc框架基类存放于站点根目录下lib文件夹中,通常情况下包含前台控制器front.php、控制器基类controller.php、临时存放需要显示数据的文件view.php等。front.php负责根据用户url请求,分析判断用户需要触发执行的model及显示view;controller.php是所有控制器的基类,用户自定义的控制器都必须继承于它。在前台控制器中,首先通过如下代码动态加载对应的用户控制器及实例化用户控制器对象:
include dirname(__file__)."/../application/controllers/".$_request["controller"]."_controller.php";
//根据url传递的controller动态加载对应的用户控制器
$rc = new reflectionclass($_request["controller"]."controller");
$controller = $rc->newinstance();
//使用反射机制实例化用户控制器类;如果用户控制器继承了控制器基类并且存在对应的方法,则执行如下代码:
$view_file = $method->invoke($controller, $_request);
//获取对应用户控制器下需要显示数据的视图路径,根据相应视图中程序功能显示数据在实际应用中,控制器基类负责返回需要显示的数据,最后由视图基类所包含的模板文件显示。
3.2 创建用户
控制器
用户控制器负责根据url传递的参数调用相应模型获取数据,然后调用相应视图输出。设计时需要保留一个默认的执行方法,在没有传递对应控制器参数时触发执行。当url传递参数为controller=user&method=user_list时,前台控制器根据该参数列表分析判断,依次生成名为usercontroller的类的实例,然后执行该类中名为user_list的成员方法。
public function user_list($params){
include(dirname(__file__)."/../models/".$params["controller"]."_model.php");
//根据用户请求动态加载用户模型
$md = new reflectionclass($model_class_name);
$model = $md->newinstance(); //使用反射机制实例化用户模型类
$str = "\$this->_data =\$model->get_".$params["controller"]."_list(".$params["id"].");";
eval($str);//根据用户请求,动态生成需要调用模型类中的成员方法
return dirname(__file__)."/../views/".$params["controller"]."/list.php";
//根据用户请求动态调用视图
}
3.3 建立用户模型
用户模型即是一些业务方法,严格来讲,用户模型是一个或一组数据对象。如同用户控制器,在设计时通常也需要保留一个默认执行方法,该方法是在url没有传递任何方法参数时触发执行,其他方法则需要url显式传递参数后触发执行。比如:
public function return_user_list(){
$unamelist = array("pido1","pido2","pido3");
return $unamelist;
}
该方法主要功能是返回用户姓名列表,当url传递参数为controller=user&method=user_list时,首先触发执行类名为usercontroller的类,然后触发其中的名为user_list的成员方法,在执行user_list方法时触发执行相应用户模型,比如本例中触发执行了return_get_list()方法,则会把用户名列表返回给相应视图调用对应模板输出。
3.4 创建显示模板
用户模板即是一些显示模型中数据的一些html、css、js、php等组合而成的文件,这些标签或语言给数据提供了相应的显示规范,使得数据按照用户需要输出。根据本例中用户模型中的数据,我们编写如下代码循环输出用户名列表:
<?php
foreach($this as $k=>$v){
echo "
".($k+1)."";
}//遍历由用户模型传递来的数组并且输出
?>
最后创建一个站点入口文件index.php,将lib下的front.php、controller.php、view.php三个文件包含过来,并且实例化前台控制器即可。
4 结束语
mvc模式不是一种设计模式,而是一种框架模式,用于描述web应用程序中结构及其中各部分的职责及其交互方式。对基于b/s的web项目来说,mvc模式的应用不仅使程序结构更趋合理,而且会降低程序模块之间的耦合度,更重要的是大大提高了程序的重用性,使得web项目在执行效率、安全性等方面都有明显的提高。
参考文献
[1] 刘耀钦,袁承芬.web系统移植的php+mysql设计研究[j].计算机系统应用,2008,8:102-104.
[2] 赖英旭,刘辉增等.mvc模式在b/s系统开发中的应用[j].微计算机信息,2006,30:62-64+113.
[3] 戴一平.mvc设计模式在php开发中的应用[j].计算机与现代化,2011,3:33-37+43.
[4] 张卓,丁振国.基于jsp的mvc开发模式在毕业设计管理系统中的应用[j].科学技术与工程,2007,11:2542-2546.
[5] kevin mcarthur.php高级程序设计模式、框架与测试.人民邮电出版社,2009:180-190.
作者简介:
刘耀钦(1980-),男,汉族,河南禹州人,讲师,硕士学位,主要从事技术应用与开发研究。
袁承芬(1979-),女,汉族,湖北荆州人,馆员,本科学历,主要从事计算机应用方向的研究。