MVC模式PHP开发框架
2017-01-18闫晓亮焦素云
闫晓亮, 焦素云
(长春工业大学 计算机科学与工程学院, 吉林 长春 130012)
MVC模式PHP开发框架
闫晓亮, 焦素云*
(长春工业大学 计算机科学与工程学院, 吉林 长春 130012)
分析了MVC设计模式的原理,阐述了框架的功能和设计思路,设计了框架的入口、模型层、视图层、控制层等核心模块,完成了一个基于MVC模式的PHP开发框架的设计。
设计模式; 开发框架; 模板引擎
0 引 言
当今世界处于信息化时代,人们对于信息的需求日渐多样化。企业需要先于竞争对手发布信息,商家需要尽早的获取有用信息,能否高效的掌控信息成为事业兴衰的关键。Web系统作为信息发布的平台,越来越受到各类企业的青睐。企业如能快速地开发出适合自己业务类型的Web系统,及时地把商业信息发布出去,就能占据信息的制高点,更容易获取成功。因此,快速的软件开发对于企业发展来说十分重要。
在软件开发领域,项目的快速完成离不开框架,然而由于种种原因,PHP没有公认的比较完美的框架,虽然各种各样的框架层出不穷,但是没有一个能被普遍接受[1]。每个公司都有自己的业务需求,PHP程序员更加热衷于实现一个属于自己的框架来搭建Web应用系统,以满足自己特殊的需求。
软件设计模式是近年来兴起的一个概念,它指的是那些被反复使用、成熟可靠的软件设计思想,使用该模式可以方便快捷地构建出满足自己需求的应用软件[2]。MVC设计模式在软件开发中为广大的程序员所接受,因为它能更好地描述和表示现实世界。文中将基于MVC模式设计一个用于进行Web开发的PHP框架,框架的名字为SprwPHP。
1 MVC设计模式
MVC是3个英文单词的缩写,“M”代表“Model”,是“模型”的意思,“V”代表“View”,是“视图”的意思,“C”代表“Controller”,是“控制器”的意思。MVC模式即指“模型-视图-控制器”设计模式,它把一个应用的输入、处理、输出分成相互分离的三层,便于理解和控制,也便于相互独立的开发[3]。MVC模式原理如图1所示。
图1 MVC模式原理图
1.1 模型
模型是具体用来处理用户请求的部分。视图和用户进行交互,实质是接受用户的请求,并把这种请求转化为特定的数据流或状态,然后由控制器把该数据流或状态路由给相应的模型,模型再对它进行相应的加工和处理,模型定义了处理这些数据流的规则和逻辑操作集合。模型的运作是暗箱模式,对用户来说是完全透明的,用户只需要通过视图告诉系统“我要干什么”即可,具体的操作部分由模型来完成[4]。在抽取应用模型的时候,抽象的级别很重要,不能太高也不能太低。如果抽象的级别太高,在实现的时候过于复杂,需要再具体考虑很多额外情况;如果抽象级别太低,则仅能完成特定的功能,没有冗余能力。合适的抽象级别应当根据具体的应用情况来定,适合自己应用的抽象级别就是最好的。比如“老板给员工布置任务”这个情景中,老板“把A任务完成”这条命令就相当于MVC模式当中视图部分的数据流,员工B相当于模型,用来完成老板布置的任务。如果抽象级别高,员工B需要想很多种不同的办法来应对老板的命令;如果抽象级别低,员工B只需要任意一种办法来应对老板的命令。在安全性要求高的领域,模型的抽象级别应该高一些,以适应各种不同的突发情况。
1.2 视图
视图,顾名思义就是指用户所能看到的东西。在应用系统当中,指的是用户看到的系统界面,用户可以通过该界面获取自己想要的信息,并且可以通过它和系统进行交互。在Web开发领域,特指HTML等前端技术制作的界面[5],在PHP开发中也可以理解为Smarty模板。如今的应用需求越来越复杂,Web系统所处理信息的规模越来越大,对于视图界面的要求也越来越高,但从技术的角度来说,视图的本质只是用来显示和接受数据。对于具体数据的处理操作由模型部分来完成。比如,图书馆查询机的视图,只接受读者的查询指令并将结果显示给读者,具体的查询流程和操作则是由控制器将指令传递给模型,再由模型来完成复杂的查询操作。
1.3 控制器
控制器即用来进行控制,它在视图和模型之间起到桥梁的作用,对视图和模型之间来回的数据进行选择分发操作[6]。视图接收用户交互所产生的数据,但不对数据进行处理,它只是把数据传递给控制器,由控制器选择特定的模型来处理数据,当模型将数据处理完毕之后,再通过控制器选择相应的视图将处理结果显示给用户。
2 框架功能分析和设计思路
2.1 框架的功能分析
开发框架的首要目的是为了进行快速软件开发,缩短软件研发的周期。因此,框架集合了一般项目开发中必须的部件,这些部件在不同的项目中重用性很高。做个比喻,如果把软件开发比作盖房子,那么框架则相当于建筑的毛坯房,而框架提供了很多建筑通用的零件,结合设计图纸,开发者可以迅速建造出一套合乎心意的房子出来。
文中设计的SprwPHP框架是采用了面向对象的思想并基于MVC模式。SprwPHP包含了作为开发框架应有的基本功能,框架的入口采用单点接入模式;设计了简洁明了的目录结构,包含常用的类,支持扩展类,能够对URL进行处理,对用户的输入进行处理,也能对各种错误和异常进行处理。
2.2 框架的设计思路
刚入门的开发人员会认为框架的设计是一个很复杂的过程,其实,在熟练掌握了面向对象的思想及MVC设计模式之后,结合框架工作的基本原理,设计一个简单实用的框架将变得容易起来,一图胜百语,我们在功能分析的基础上,设计了SprwPHP框架的组成结构,如图2所示。
图2 框架的组成结构
3 框架核心模块的设计
3.1 框架入口设计
系统的入口模式分为单一入口和多入口两种。在动态Web系统流行之前,以网站为主的Web系统是由许多独立的文件和页面组成的,称之为静态系统,当时的系统接入大多采用多点接入方式,要访问某个特定的文件或页面,直接通过URL定位到文件所在的位置即可[7]。该方式在应用日益复杂的当下已经不再流行,如今的Web系统包含的信息量巨大,需要统一的管理和优化,多入口的模式无法做到这一点,而且多接口会暴露出不必让用户了解的系统信息,这些信息如果被用意不纯的人获取,可能会给系统带来很大的危害。单一入口则会将所有的用户请求rewrite到同一个文件,通常是脚本文件,由该文件接受用户的所有请求,这些请求再被传递到控制层。采用单一入口有很多优点,它使系统的权限验证更加方便,不必每个文件进行单独验证,提高了验证的效率;它还能使URL的重写变得容易,重写URL之后,只需针对入口文件编写几条规则,不用再针对其他的脚本文件编写规则;另外,由于只有一个入口,因此能够对系统进行统一的管理。SprwPHP框架的入口采用单一入口模式,设计示意如图3所示。
图3 框架入口设计
3.2 模型层设计
模型是具体用来处理用户请求的部分,对于动态的Web系统来说,指的是操作数据库的接口部分,也可以把它作为功能辅助类,辅助控制器的工作。这部分的设计非常重要,包括3个重要部分:数据库驱动的初始化、数据库的CRUD操作以及映射数据表。SprwPHP框架的模型层采用三层架构的模式。为了支持多种数据库以实现良好的扩展性和可移植性,本框架采用PDO套件,它支持主流的数据库驱动。模型层设计如图4所示。
图4 模型层设计
3.3 视图层设计
视图即用户所看到的界面,用户可以通过视图界面与系统进行交互,提交各种请求。传统的PHP开发中,实现逻辑功能部分的PHP代码嵌入在视图部分的HTML代码当中,两者混合在一起,不便于系统的扩展和维护。要实现逻辑(PHP代码)和表现(HTML代码)的分离,需要使用模板技术[8]。Smarty模板引擎是用PHP开发的模板引擎,如今已是PHP的标准模板引擎,使用它能够使PHP程序员和美工人员各自独立工作,美工人员改变视图不会影响到程序的逻辑内容,反之亦然,可以很好地解决上述问题。在团队合作的项目中,这一需求相当重要,因此,在视图层,SprwPHP框架选择Smarty作为模板引擎。基于以上分析,设计了视图层的处理流程如图5所示。
图5 视图层的处理流程
由图中可见,用户向Web系统发送页面请求,系统首先判断视图层中是否存在生存期内的缓存页面,如果存在,则将此页面响应给用户;如果不存在,则判断是否有编译好的模板,再检查该模板是否更新,执行最新编译的模板,输出响应页面给用户;如果也没有编译好的模板,则调用数据结合HTML框架编译出一个新的编译模板文件,再执行编译好的模板文件,生成响应页面给用户。
3.4 控制层设计
控制器的设计非常关键,它在视图和模型之间起到桥梁作用,该层需要完成配置文件的读取、函数库的加载、框架核心加载等初始化工作。相对于模型层封装数据处理逻辑,控制层封装的则是业务逻辑。由于SprwPHP框架在系统入口处采用的是单一入口模式,用户的各种不同的数据请求需要经过同一个入口进入,因此,在控制层应该设计路由模块,针对用户的不同请求选择不同的控制器,再由控制器选择模型来处理用户的请求,在相关的模型处理完数据后,控制器还需要选择视图将响应数据输出给用户。
基于以上分析,设计出SprwPHP框架控制层的处理流程,如图6所示。
图6 控制层处理流程
3.5 其他模块的设计
完成了框架核心部分的设计之后,还需对框架的一些重要模块进行设计。主要包括常用工具类的设计、缓存的设计和框架的目录结构。
SprwPHP框架集成的常用工具类有:字符串处理类、图像处理类、文件上传类、错误和异常处理类、输入控制类等,都是项目开发过程中使用频率很高的类,将它们以相对独立的方式集成在框架之中,可以为各个模块调用,使用这些类可以提高项目开发的速度和质量。为了提高扩展性,框架还允许使用者自定义扩展类。
在缓存设计方面,本框架提供了两种缓存机制:文件缓存和内存缓存,它们能够一起使用。文件缓存依靠Smarty的缓存机制实现,利用Smarty模板引擎生成静态页面,不必每次都从数据库中提取数据,从而达到缓存的效果;内存缓存则是基于Memcache,这是一个开源的内存对象缓存系统,使用它可以将数据表的结果集以及访问系统时的Session信息缓存在Server端的内存当中[9]。使用这两种缓存机制能够提升系统的整体性能。
为了便于框架的学习和使用,SprwPHP的目录结构设计力求简单明了。框架使用sprw.php作为公共入口文件;cores目录用来存放框架的核心类;exclasses目录用来存放框架的扩展类;commons目录用来存放框架的通用资源和公共函数;libs目录则用来存放Smarty模板引擎的源文件。
4 结 语
原生态的PHP开发,把代码夹杂在HTML页面当中,这在信息更新、变化迅速无比的今天是不合时宜的。文中设计的SprwPHP是基于MVC模式的PHP开发框架,使用该框架进行Web项目的开发能够轻易地将系统的业务逻辑和显示界面进行分离,美工人员和程序人员能够各自独立地开展工作,这使得系统的开发效率得以提升。通过将功能模块限制在各自的范围之内,系统的耦合度得以降低;缓存机制的使用使系统的性能大大增强[10]。另外,该框架集成了Web开发中经常使用的功能类和常用函数库,提升了代码的重用率和系统的可维护性。随着技术的发展,各种新兴的设计模式也不断出现,能否把最新的技术特性和模式引入到框架系统的设计中,这是下一步研究的方向。
[1] 张超.基于PHP的Web开发框架的设计与实现[D].沈阳:东北大学,2013.
[2] 李开涌.PHP MVC开发实战[M].北京:机械工业出版社,2013.
[3] 佚名.MVC模式[EB/OL].(2015-04-22)[2016-03-10].http:// baike.haosou.com/doc/5411388.html.
[4] 崔伟.基于MVC设计模式的PHP快速开发框架研究与实现[D].西安:西北农林科技大学,2010.
[5] 胡晶,董航.HTML5核心Wed技术分析[J].长春工业大学学报:自然科学版,2013,34(6):587-590.
[6] 桑德.Learning PHP设计模式[M].北京:中国电力出版社,2014.
[7] 王志勇.基于RIA和MVC的PHP开发框架的研究与实现[D].成都:电子科技大学,2012.
[8] 高洛峰.细说PHP[M].2版.北京:电子工业出版社,2012.
[9] 吕志强.基于MVC模式的PHP框架设计[J].科技视界,2013(24):65-66.
[10] 崔伟,胥立,黄林.PHP开发框架关键技术分析[J].计算机光盘软件与应用,2012(20):229-230.
PHP development framework based on MVC pattern
YAN Xiaoliang, JIAO Suyun*
(School of Computer Science & Engineering, Changchun University of Technology, Changchun 130012, China)
MVC design pattern is analyzed, and framework functions and design ideas are discussed. We design the entrance of the framework, model layer, view layer, controller layer and other core modules to fulfill the design of MVC pattern based PHP development framework.
design pattern; development framework; template engine.
2016-03-10
闫晓亮(1989-),男,汉族,河南洛阳人,长春工业大学硕士研究生,主要从事网络安全方向研究,E-mail:shulijian@yeah.cn. *通讯作者:焦素云(1969-),女,汉族,吉林长春人,长春工业大学副教授,博士,主要从事系统结构方向研究,E-mail:jiaosuyun@ccut.edu.cn.
10.15923/j.cnki.cn22-1382/t.2016.6.15
TP 311.52
A
1674-1374(2016)06-0592-05