首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

MVC 模式、类封装还是黑客代码 合理设计 PHP 项目-实例涉及大量商业逻辑项目-1

MVC 模式、类封装还是黑客代码 合理设计 PHP 项目-实例涉及大量商业逻辑项目-1

方案一:涉及大量商业逻辑项目如何分离用户界面和后台操作?如何避免将商业逻辑混淆于一般的流程控制中?作为一个严谨的商用项目,就需要考虑很多类似的问题。对于由 PHP 担当的这类项目,贯彻 Model-View-Controller(MVC)模式的设计是一个非常好的方法。
理论描述在这里我不想多加解释 MVC 模式本身 -- 简单的从字面上以及应用上说,通过将系统的设计分为 Model 模型 / 逻辑、View 视图 / 界面、Controller 控制 / 流程三个逻辑部分达到良好的项目效果,以此便利各部分开发者的工作并降低日后的维护成本。(如果您熟悉 JSP 开发的 Model  2 模式,可以发现它也是 MVC 模式的很好体现。)就现实的项目开发而言,现存的很大问题包括网页设计人员和程序开发人员的工作交错和冲突以及商业逻辑嵌入页面造成不可重用也很难维护等等。引入 MVC 模式一方面可以为系统的总体设计指出明确的方向,对于开发团队的分工也是良好的指导。
既然依照 MVC 模式要求对系统的总体结构在逻辑上分成三部分,那么团队的开发者中也存在着针对各个部分的开发者。
开发者角色相关系统逻辑职责网页设计人员View 视图 / 界面设计所有用户界面的网页模板。控制流程开发人员Controller 控制 / 流程编写系统流程中的所有 PHP 页面。商业逻辑开发人员Model 模型 / 逻辑开发系统设计中规定的各个类(其中的方法)。
由以上的表格可以看出,传统的网页设计和程序开发的人员分工被打破而取而代之的是根据系统逻辑划定的职责。对于网页设计人员,职责并没有改变,准确说由于这样的划分避免了以往与程序设计人员的纠纷,他们完成的只是网页模板,因此只需关注于纯粹的网页代码(主要是 HTML,也许会有其他客户端的代码比如 WML 之类)而根本不需要被服务器端的 <? … ?> 干扰。程序设计人员则被分为两部分:其中比较容易把握的是商业逻辑开发人员,他们的任务是根据系统分析员给定的模块(准确说是类方法)完成之,在他们手中的 PHP 更像一般的程序设计语言(比如 Java)而与 Web 没有什么关系;一时较难接受的是控制流程开发人员,他们的任务是在实现系统设计时制定的系统流程的同时,根据客户端的输入调用商业逻辑(相应的类方法)以及输出更新的界面(对设计网页模板进行处理),在他们手中 PHP 可以充分发挥 Web 编程语言的优势。
代码组织相关的话题这样的观念有些抽象,没有实例的演示很难接受。在举例之前先介绍一下我对这类工程的推荐代码结构:
一级目录二级目录三级目录备注/project_name

项目源代码根目录
/Templates
网页模板目录(View)

/admin管理控制台目录 /admin 下的网页模板
/Include
商业逻辑目录(Model)
/Temp
临时代码目录(可选),可供开发者进行一些试验代码的测试
/images
图片目录,网页模板采用
/css
样式单目录,网页模板采用
/scripts
客户端代码目录,网页模板采用
/admin
管理控制台目录(可选),包含所有后台管理的功能代码

/other_dir对应与源代码根目录下的 /other_dir,包含管理该类的功能代码
/other_dir
其他与相应功能相关的目录,比如与用户相关的 /member 目录或者与从产品相关的 /product 目录等等
/config.inc.php
全局配置变量,定义系统中的全局变量
/security.inc.php
安全策略控制(可选)
/error.php
错误控制返回页面(可选),也可以采用静态页面如 /error.html 或者其他页面名称
看完之后您是不是被唤起了一点使用 Java 进行 Web 开发的记忆?比如 WEB-INF 目录下的 classes 目录和 lib 目录以及 web.xml 都是开发中的规则 -- 虽然支持 PHP 的 Web 服务器不可能像 Java 应用服务器那样自动加载这些目录下的文件,但是规定一个合适的代码组织模式还是非常有利于开发的便利和后续的维护的。(我开始考虑 PHP 项目的代码结构就是由 Tomcat 的开发手册中获得了启发。)
一个用户登录的例子根据以上的代码目录,前文所说的 MVC 模式的实现可以得到更简单的解释。以最常见的用户登录功能为例,设想 /project_name 目录下有一个 /member 目录包含有关于用户的一切功能,其中包含了 login.php 页面接受用户登录使用的用户名称和密码,index.php 页面是登录完成之后的用户主页,而 /project_name 目录下的 error.php 是登录失败后的错误显示页面。
  • 用户通过系统的其他部分请求进入用户主页即 /member/index.php 页面,此时该页面判断用户情况:已登录用户则直接显示本页内容(可以采用检查 session 等方法);未登录用户则需要登录(重定向到 /member/login.php);出现了未知错误(重定向到 /error.php)。同时采取相应的反应。
  • 假如用户被引导至登录页面即 /member/login.php 页面,该页面接受用户的登录信息(用户名称和密码),并判断是否正确登录:正确登录则再次重定向到用户主页 /member/index.php ;登录错误则重定向到 /error.php 。
  • 假如用户被引导至错误显示页面 /error.php 页面(无论是从以上哪个页面前来),都会显示错误信息。
流程图示如下:
根据以上的文字描述和图示,再结合 MVC 模式的实现,可以非常轻松的写出这几个页面的框架代码:
  • 先看简单的页面 /error.php:
  • 然后是 /member/login.php:
  • 最后是 /member/index.php:
(注意:以上代码只是片断,而且没有考虑项目全局,只起演示作用)
返回列表