设为首页 收藏本站
查看: 709|回复: 0

[经验分享] 基于MVC架构的Web应用系统设计 -PHP

[复制链接]

尚未签到

发表于 2017-4-9 11:10:04 | 显示全部楼层 |阅读模式
摘   要: 分析了MVC描述的软件模型,通过一个基于PHP语言并结合XML和XSL技术的MVC架构的设计实例讨论了MVC模式设计的方法。
关键词: MVC架构  控制器  视图  模型

1  MVC描述的软件模型
  MVC是Model-View-Controller(模型-视图-控制器)的缩写,它把一个应用的处理流程分成模型层、视图层和控制层,这三层结构之间的关系如图1所示。

  模型层(也称业务层)用于处理程序逻辑。它的任务是管理应用程序域的行为和数据,响应来自控制层的状态指令,把原有数据按照业务逻辑转换成指定意义的数据提供给视图层显示。
  视图层用于把表示模型数据、逻辑关系和状态的信息以特定的形式表现在用户界面上。视图层的显示信息来自模型层,同一个模型可以对应多个视图。
        控制层用于处理用户与软件的交互操作。控制层通知模型和视图做出相应的状态改变,使模型和视图协调工作。
2  MVC模式设计
  MVC的目的是增加代码的重用率,减少数据表达、数据描述和应用操作的耦合度,从而提高软件的可维护性、扩展性和灵活性。MVC模式把界面表现和逻辑控制语句强制分离,解决了页面设计和程序开发中的工作交错与冲突,并解决了由于商业逻辑嵌入造成程序不可重用而且很难维护的问题。
  本文设计了一个基于PHP语言、XML和XSL模板技术的MVC架构的Web应用系统。
2.1 代码结构
  在系统中每一个页面被定义为一个Action,可以通过网址http://servername/index.php?action=actionname来访问页面。控制器中定义了每一个Action对应的模型和视图,它们之间的对应关系如图2所示。

  表1为系统的基础代码结构,除少量的静态页面放在htdocs目录下外,其余的程序都放在PHP的库文件目录下。

  在这个代码结构中,模型、视图和控制器三部分分别放置在不同目录中。其中,视图层包括显示模板(XSL)和页面操作控制(JS)二部分,模型层包括业务逻辑处理类库(Action Class)、数据输出处理(Action Execute)和PHP基础类库(PHP Class)三部分。因此,在系统中各部分的开发由不同的角色来完成,角色之间的工作交错和冲突可以减少,使系统程序升级和维护的思路也更加明晰。
2.2 系统实现
  在系统中,客户端浏览器中呈现的是系统的视图部分,而模型和控制器则是透明的。当Web 服务器接收到客户提交的HTTP请求后,交给服务器中的控制器来处理。控制器按照请求中的Action信息,从系统配置中提取此Action的映射表,并把此请求映射到相应的处理模型;处理模型进行业务逻辑处理,处理完后返回状态更新的请求并将XML格式的数据结果给控制器;控制器根据结果选择相应视图模板并合成视图返回给客户。程序架构如图3所示。

2.2.1 控制层的实现
  在这个系统中,控制器主要有以下四个作用。
  (1)根据Action名称从数据库的映射表中找到处理此Action的模型信息、视图模板和此视图的用户操作控制信息。
  (2)调用模型处理Action请求。
  (3)合成业务逻辑处理返回的XML格式的数据信息和XSL视图模板为HTML的文件,并返回给客户端。
  (4)在接收到一个业务逻辑处理模型返回的状态更新请求后,调用一个新的业务逻辑处理模型处理此请求。
  控制器主要包括二个文件:includes/prepend.inc和includes/controller/controller.inc。 prepend.inc文件被设定为自动增加在被访问的文件前,因此这个文件非常适合作为控制器的主文件;Controller.inc中主要是控制器中的处理函数。这二个文件的代码如下。
prepend.inc
<?
include_once(″/action/configure/db.conf″);//数据库连接对象
include_once(″/control/controller.inc″);//控制器

$actionobj=getaction($action);     //获得Action信息
if($actionobj[″model″] !=″″){
                   //调用model处理action请求信息
include_once($actionobj[″model″]);
eval(″\$modelobj=execute_″.$actionobj[″action″].″( );″);
if($modelobj[″type″]==″xmldata″){//返回html
                     //输出xml和xsl合成的html数据
    echo xmlpraser($modelobj[″data″],$actionobj[″view″]);
}else if($modelobj[″type″]==″state″){  //请求更新状态
    header(″Location:?″.$modelobj[″data″]); //交新模型处理
    exit;
}
}else{//直接调用View输出}
?>
controller.inc:
<?
****得actionobj的信息****
function getaction($action){
global $dbobj,$conn,$result_id;      //数据对象,连接,结果集
                  //从数据库中检索action对象信息
$sqlstr=″select*from t_action where action=′″.$action.″′″;
$result_id=$dbobj->exec($conn,$sqlstr);
if($dbobj->fetch_row($result_id)){
    $actobj[″action″]=$action;
                    //action的处理模型名称
    $actobj[″model″]=$dbobj->result($result_id,″model″);
                    //action的视图模板信息
    $actobj[″view″]=$dbobj->result($result_id,″template″);
                    //其他控制参数
}else{ … }
return $actobj;
}
                  //****解析xml和xslt****
function php_scheme_get_all($Processor,$Schema,$RestUri){
$url=$Schema .′:′. $RestUri;
return file_get_contents($url);
}
function xmlpraser($data,$xslpath){
global $SYS_INCLUDEPATH;
$parser=xslt_create( );  //初始化解析对象
xslt_set_scheme_handlers($parser,array(′get_all′=>
′php_sheme_get_all′));      //设置处理方式
$parms[″_xml″]=″<?xml version=\″1.0\″ encoding=\″gb2312\
″?>″ . $data;             //合成xml格式数据
$parms[″_xsl″]=file_get_contents($SYS_INCLUDEPATH.
″\\″ . $xslpath);         //读取xsl模板文件
$result.=xslt_process($parser,′arg:/_xml′,′arg:/_xsl′,
NULL,$parms);        //合成视图
xslt_free($parser);    //释放解析对象
return $result;
}
?>
2.2.2 模型层的实现
  模型是系统的数据核心。此系统中模型层主要包括三部分内容。
  (1)业务逻辑处理。业务逻辑处理又可以分为二类:一类是抽象出来的业务逻辑,被封装成一个个PHP类;另一类是对某一具体Action的逻辑处理。
  (2)PHP的基础类库。此部分与业务逻辑无关,描述的是对任何一类的应用系统中都要使用的公共函数类,这些类可以被其他程序调用。
  (3)数据输出处理,把PHP数据转换成XML格式输出。
  按照控制器的定义,每一个Actionname都要调用一个命名为execute_actionname( )的函数,这个函数会返回Action的处理结果。处理结果有二种情况:一种是返回XML格式的数据;一种是返回要求系统更新状态的状态值。一个典型的模型处理器程序结构如下:
<?
include_once(″/action/tool/tools.inc″);  //工具系统的基础类
function gettoollist($toolid){       //获得工具信息
                    //指定要获得的工具信息
$params=array(″toolname″,″part_no″,″quantity″);
$toolobj=new toolinfo;         //创建toolinfo类实例
$toolstinfo=$toolobj->GetToolListinfo($toolid,$params);
return $toolsinfo;           //返回工具列表信息
}
function getxml($toolsinfo){      //转换工具信息为xml格式
while(list($id,$toolarray)=each($toolsinfo[″data″])){
   $xmlstr.=″<items>″;
    while(list($key,$value)=each($toolarray)){
      $xmlstr.=″<″ .$key. ″>″.$value.″</″.$key.″>″;
    }
     $xmlstr.=″</items>″;
}
return $xmlstr;
}
function execute_tool_toollist( ) {    //工具列表action的处理函数
$toolinfo=gettoollist($toolid);      //工具信息
if($toolinfo[″state″]){          //输出xml格式数据
  $rtnobj[″type″]=″xmldata″;
  $rtnobj[″data″]=getxml(($toolinfo);
}else{                //跳转到错误处理页面
  $rtnobj[″type″]=″state″;
  $rtnobj[″data″]=″errorhandle″;
}
return $rtnobj;
}
?>
2.2.3 视图层的实现
  视图是系统与客户交互的窗口。在Web应用系统中,视图是指客户最终看到的HTML页面。为了使页面具有风格统一、整齐、可配置的特点,系统一般都会采用模板技术。此系统即使用了XSL模板技术。系统中的视图层包括二部分:一部分是放在/includes/template目录下的XSL模板;另一部分是放在/htdocs目录下的js和css文件。最后,由控制器来完成合成视图的任务。
2.3 系统适应性 
  从整个系统的设计结构可以看出,系统的业务逻辑和显示是分离的:首先由网页设计人员和程序员共同确定需要的数据项和Action名称,在控制器中添加此Action;之后,网页设计人员设计各个显示模板;程序人员完成相应的模型处理程序。这样的设计方法有利于对系统的维护和功能扩展。
  在MVC系统中处理用户需求的思路非常明确。视图的修改和模型处理的修改基本上是独立的,无论是在系统开发时期还是在系统维护时期,网页设计人员和程序员都可以更加专注于自己的任务。系统中的模型可以是自包含的,由于与控制器和视图相分离,所以很容易改变程序的数据层和业务规则。例如把数据库从 Mysql移植到Oracle上只需改变数据库连接模型即可;而把界面显示从HTML改为Flash或WAP只需改变视图显示和相应控制器即可。一旦正确地实现了模型,视图将会正确地加以显示。这样,系统维护的成本和项目的开发风险都被大大降低。
3  结束语
  MVC设计思想中的三部分是相互独立的,既可以通过不同的技术实现,也可以运行在不同的基础平台上。随着更多新技术的出现,还可以创造出更多的应用方式。所以MVC设计模式的确是一个创建优秀软件的途径。
  本文所描述的只是MVC应用系统开发的一个基础模式。模型和视图严格分离的模式相对混合模式,对开发和设计人员的要求要高一些,但更容易进行错误控制。此外,在实际的应用中,开发者还要结合各应用项目的业务需要进行详细的设计规划,认真考虑应用的额外复杂性。只有把这些想法融进到架构中,才能增加应用的可拓展性。只有把握这一点,MVC模式才会使得应用系统更加健壮、更加灵活和更容易扩展。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-362342-1-1.html 上篇帖子: 我的第一个PHP程序——实现网站的模拟登录 下篇帖子: PHP XML操作类 xml2array -- 含节点属性
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表