浅解用PHP实现MVC

MVC是一个老生常谈的问题,是为了解决一类共同问题总结出来的一套可复用的解决方案,这是软件设计模式产生的初衷 。不管是客户端还是移动端,MVC的分层设计模式解决了软件开发中的可复用、单一职责、解耦的问题,php语言中的MVC设置模式也是如此 。下面通过PHP语言细说MVC模式如何在PHP中应用,本文主要从如下几方面介绍:
Ø MVC的工作原理
Ø PHP开发框架
a) 开发框架的优势
b) 使用框架进行模块划分
Ø 一个简单MVC框架总体架构分析
a) URL访问方式【URL Parser】
b) 控制器【Controller】
c) 视图【View】
d) 运行时【Runtime】
1、MVC 的工作原理
MVC框架图:
视图View
代表用户交互的页面、可以包含html界面、Smarty模板等和界面相关的元素 。MVC设计模式对于视图的处理仅限于视图上数据的采集和处理,以及用户的点击、拖动等事件的处理,而不包括在视图上的业务流程处理 。业务流程会交给模型层(Model)处理 。
模型Model
模型层是对业务流程、状态的处理以及业务规则的指定 。业务流程的处理过程对其他层来说是黑箱操作,模型接受视图的请求处理数据,返回最终的处理结果 。业务模型还有一个很重要的模型--数据模型,数据模型主要指实体对象的数据保存(持久化) 。比如将一张订单保存到数据库,从数据库获取订单,所有和数据库相关的操作限定在该模型中 。
控制器Controller
控制层是View层和Model层之间的一个桥梁,接收到用户的请求,将模型和视图匹配在一起,共同完成用户的请求 。比如,用户点击一个链接,控制层接收到请求后,把信息传递给模型层,模型层处理完成之后返回视图给用户 。
2、PHP开发框架
2.1、开发框架的优势

  • 框架提高开发效率和质量
  • 框架处理了许多基础性工作
  • 框架处理细节工作(事务处理、安全、数据流控制)
  • 框架结构性好、扩张性好
  • 框架划分子问题,易于控制、易于延展、易于分配资源
2.2、使用框架进行模块划分
一个典型的后台应用模块的划分
  • 平台操作管理
    • 登录管理
    • 操作界面管理
  • 系统管理频道
    • 常规管理
    • 公告管理
    • 友情链接挂你
  • 内容管理频道
    • 图片管理
    • 栏目管理
    • 文章管理
    • 幻灯片管理
  • 用户管理频道
    • 用户组管理
    • 用户管理
模块设置操作
  • 每个模块可以设置查看、添加、修改、删除、搜索等操作
  • 模块太大应该划分子模块,适合的模块数量为8~12个

3、一个简单MVC框架的分析
从以下五个方面来分析
  1. URL访问方式(URL Parser)
  2. 控制器(Controller)
  3. 视图(View)
  4. 模型(Model)
  5. 运行时(Runtime)
3.1、URL访问方式(URL Parser)
URL使用PATHINFO模式(index.php/index/index/),应用的访问方式都是采用单一入口的访问方式,所有访问一个应用中的具体模块及模块中的某个操作,都需要在URL中通过入口文件后的参数来访问和执行,所有访问都会变成由URL的参数来统一解析和调度,格式如下:
不带参数的URL
http://example.com/index.php/user/add
带有参数的URL
http://example.com/index.php/user/add/cid/5
http://example.com/index.php/user/add/cid/5/page/6
这种采用单一入口和PATHINFO模式的URL访问是MVC实现的基础,作为单一入口的框架的入口brophp.php文件则负责处理基本的信息,包括了
  • 路径信息:BroPHP框架的路径,用户项目的应用路径,项目的根路径等
  • 包含框架中的函数库文件
  • 包含全局的函数库文件,用户可以自己定义函数在这个文件中
  • __autoload()自动加载类
  • 页面缓存配置
  • 初使化时,创建项目的目录结构
  • 解析处理URL
1)路径信息处理
路径信息会保存在$GLOBALS全局数组中,后面的页面需要使用到直接从$GLOBALS中获取即可
//模板文件中所有要的路径,htmlcssJAVAscriptimagelink等中用到的路径,从WEB服务器的文档根开始
$spath = dirname($_SERVER["SCRIPT_NAME"]);
if ($spath == "/" || $spath == "\")
$spath = "";
$GLOBALS["root"] = $spath . '/'; //Web服务器根到项目的根
$GLOBALS["App"] = $_SERVER["SCRIPT_NAME"] . '/'; //当前应用脚本文件


推荐阅读