蒋先梅
(江苏联合职业技术学院徐州经贸分院,江苏 徐州 221004)
PHP 即“超文本预处理器”,是一种开源的、免费使用的、运行在服务器端的脚本语言[1]。 PHP 吸纳多个语言的优点,创造出自己独特方便快速的语法风格。 PHP 支持面向过程和面向对象这两种开发方式。PHP 和HTML 可以相互嵌入使用,修改快捷、简易、实用性强、跨平台性好、方便移植,在Web 系统开发领域中占据了重要的地位[1]。 MVC 是一种软件开发模式,已广泛流行于系统的开发与应用中。 随着互联网高速发展,Web 应用的功能需要也越来越复杂,MVC 在Web 开发领域也备受欢迎。
MVC 全称ModelViewController,是一种软件设计思想典范。 Model(数据模型)、View(视图)、Controller(控制器)三大核心模块在Web 系统起到至关重要的作用,分别处理各自范围内的事情[1]。 数据模型只与数据库有关系,只处理应用程序数据逻辑部分,数据库的数据增删改查在此模块内实现。 视图把从数据模型中获取的数据,进行格式化展示到浏览器的前端页面上。 控制器是整个系统的调度中心,统一协调各模块之间的工作。 控制器经常从视图中获取用户请求数据,把数据送入模型中进行处理,处理用户交互任务。 当客户端(浏览器)单击页面表单请求命令,控制器获取表单请求,调用Model 来处理数据, 调用View 来包装数据,需要调用哪些模块由控制器来决定,最后通过浏览器向客户返回请求结果。 MVC 的工作详细流程如图1 所示。 三大模块的协作工作原理如一个公司的运作,Controller 如管理层只负责整个公司的调度工作,Model 如财务部只负责管理钱款流动,View 如市场部负责外部运作、包装。
图1 MVC 的工作流程
在软件系统设计中MVC 框架就是一个代码规划的骨架,设计一个所有项目通用的底层代码,为了提高项目开发的效率。 以房地产开发商开发的商品房来类比,MVC 框架就如开发商把房子的结构功能已完成,只是个毛坯房,业主可以根据需要去装修,需要一个奶茶店时,只需要把房子按奶茶店的布置去装修,而不需要重新盖一个房子。
MVC 设计模式可以把整个项目分成应用(Application) 和 框 架(Framework) 两 大 部 分, 在Application 应用中处理与当前站点相关的业务逻辑,在Framework 框架中封装所有项目的底层代码[1]。在一个MVC 框架中,往往可能有多个相对独立的应用站点,最典型的就是一个网站的前台界面(对外的)和后台管理界面(对内的)。 一个平台就是一个相对独立的应用(站点,项目)。
本文的新闻管理系统是基于PHP 技术,采用MVC 思想进行设计。系统的目录结构按 App, Frame,Public,index. php 进行分配。 App 中Home 目录代表网站的前台为用户提供服务,Admin 目录代表网站的后台为管理员提供管理功能。 前台Home 目录和后台Admin 目录:Controller 主要存放模块的控制器文件,Model 主要存放模块的模型类文件,View 主要存放模块的视图文件。 App 中Conf 目录中放置配置文件信息。 Frame为框架类库目录,存放框架初始化类、基础控制器类、基础模型类、数据库工具类、工厂模型类底层代码文件。 Public 为公开文件目录,主要存放css,images 和js文件。 index.php 为系统的入口文件。
为了更好演示MVC 设计模式中各模块的工作原理,本文设计的新闻管理系统整体功能较为简单,但完整展示了数据的基本操作功能。 前台模块的主要功能是新闻浏览和新闻检索功能;后台模块是新闻管理模块,可以对新闻后台的数据进行添加、删除、修改的功能操作。 新闻管理系统总体设计结构如图2所示。
图2 系统总体设计结构
数据库的设计在整个系统开发中起到至关重要的作用。 对本系统功能的需求分析后,数据库内容设计主要包括两个部分:一是创建管理员表用于判断管理员身份;二是创建新闻表用于存储新闻的详细信息。
在MySQL 中创建一个news 数据库,用于保存系统中的数据。 成功创建数据库后,“use news”选择news 数据库,在数据库中创建admin 管理员表和news新闻表。 在管理员表admin 中设置id 编号、name 用户名和password 密码字段。 在新闻表news 中设置id新闻编号、title 新闻标题、content 新闻内容、addtime发布时间字段如图3 所示。 两张表都成功创建完成后,需要分别为它们添加测试数据进行测试。
图3 新闻表结构
本系统基础框架按照前面对MVC 框架分析进行搭建。 如果客户每次请求,都去包含所有类文件,会造成服务器内存浪费,程序的加载速度缓慢。 可以使用类的自动加载,来实现类文件的按需加载。 常量在任何地方都可以使用,而变量只能在作用域下使用。本文把MVC 中常用的目录定义成常量,可以简化目录路径的编写。 系统的初始化阶段需要完成:配置信息、路由参数、目录常量、类的自动加载、请求分支操作。 初始化的工作可以封装成一个Frame. class. php框架基础类来完成任务。 将框架基础类定义为最终的框架初始化类final class Frame{},在类中定义公共的静态的框架初始化方法public static function run();定义self::initConfig()初始化配置信息;self::initRoute()初始化路由参数;self::initConst()初始化目录常量;self::initAutoload()初始化类的自动加载;self::initDispatch()初始化请求分支。 调用run()方法就可以直接执行调用5 个初始化功能操作。
框架基础类中初始化配置信息需要数据库配置信息和路由默认参数信息,在Conf 中创建Conf.php,在文件中配置数据库连接信息、默认路由参数。 在Frame 目录中封装一个数据库操作类Db. class. php,实现从配置文件中得到配置信息,成功连接数据库。
在MVC 设计模式中,每一个模块都是一个控制器,多个控制器之间有一些公共的属性和方法。 在Frame 目录中,创建基础控制器类BaseController.class.php 文件,将公共的基础代码提炼出来放在基础控制器类中。 在创建基础控制器类之后,Home 和Admin 模块的控制器类都需要继承基础控制器类。
每个数据表都对应一个模型,多个模型之间有一些公共代码。 在Frame 目录中,创建基础模型类BaseModel.class.php 文件,将公共的基础代码提炼出来放在基础模型类中。 数据表admin 和news 的模型类都需要继承基础模型类。
在 Frame 目录中创建一个工厂模型类FactoryModel.class.php 文件,该类可以专门生产模型类的对象。
在完成MVC 模式的基础框架搭建后,接下来利用该框架完成后台模块的开发。 后台模块实质上就是对新闻数据的增删改查操作。 在Admin 目录中分别建立View,Controller,Model 3 个文件夹进行编写功能代码文件。 引入“平台”概念后,客户的每次请求,必须带3 个参数,平台参数,控制器参数、用户动作。Platform 称为P 参数,controller 称为c 参数,action 简称a 参数。 因篇幅所限,下面以新闻信息的修改为例演示MVC 分工运行过程。
在后台模块的首页视图中,选择需要修改新闻的链接“修改” 进行跳转,带着新闻唯一的编号调转到Admin 平台的News 控制器的edit 动作方法。 在News 控制器中edit动作方法中,获取地址栏id 编号 $id= $_GET['id'];创建新闻模型类对象$modelObj = FactoryModel::getInstance("NewsModel");获取指定id 数据$arr=$modelObj->fetchOne( $id)。 关于需要修改的这条新闻数据需要从Model 中调用,去新闻模型类NewsModel 获取单行数据public function fetchOne( $id),构建查询的SQL 语句$sql = "select ∗ from news where id={ $id}"; 执行SQL 语句,返回一维数组 。 修改的新闻的详细信息就返回到News 控制器中,包含修改的视图文件include VIEW_PATH."edit.html"进行显示并修改。 修改后的信息需要再次重新写入数据库中进行存储。