如何写MVC基础框架

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

如何写MVC基础框架

VC模式下,客户直接发送请求到控制器,控制器根据用户请求的资源分发到相对应的模型来处理,模型完成了业务逻辑后,把所要的数据发送到视图,视图显示返回给客户。这就是web 或是说B/S架构的MVC工作流程。

控制器:

用户的所有请求会发送到控制器,由控制器来根据需要调用模型和视图。比如用户请求index.php 控制器文件,index.php里面不会设计到任何的数据库操作、逻辑操作。它只会寻找执行用户请求的业务模型,把所有的业务逻辑操作交给模型也就是MVC中的M。把控制器独立出来,形成单入口访问模式,方便做全局管理,比如:日志记录等。

模型:

模型是业务逻辑数据的集合,比如数据库操作,复杂的逻辑运算等。按照功能或项目模块来分成一个个模型,模型间的耦合性很小有利于项目以后的扩展和修改。

视图:

Web技术中的MVC的C层。其主要是由HTML 、XML语言组成的界面。以前的web界面是视图和模型混杂在一起使用,形成了杂乱的代码,这样使日后程序的维护十分艰难。PHP中知名的模板引擎smarty 就是为了实现模型和视图分离的一种技术。现在smarty 在PHP行业中被开发者广泛使用。

MVC思想不是为了某种语言而设计的,它适用于所有的面向对象的语言。比如知名的实现MVC思想的JAVA语言的Struts 框架。当然PHP 框架也是百花齐放如:Zend Framework 、Fleaphp 、Thinkphp 、Cakephp 等,都能很

好的实现MVC思想而且他们大量应用了GOF 设计模式,开发人员如果基于以上几种MVC框架来进行项目开发的话,开发的效率和代码质量都会大幅度提升,特别是多人协作开发的项目。那PHP怎么实现MVC的呢?下面给大家开发一个简单的MVC基础框架来说明这一点,完整代码附光盘09/20。

类驱动

在php5中可以使用__autoload 函数来实现类自动加载。但单纯这样的方式不够灵活的。比如类文件存放在不同的目录里面,而此时又需要自动加载的情况下,我们就需要在__autoload函数里进行复杂的逻辑判断来实现自动加载。

比如需要实例化两个类:Myblog 、Mybook。Mylog类在根目录下的Lib/test.p hp 文件里,Mybook类在根目录下的App/command.php 文件里。

__autoload

函数里实现加载:

[php]php

function __autoload($class){

if($class =='Myblog') include 'Lib/test.php';

if($class =='Mybook') include 'App/command.php';

if(!include_once($classpath)){//加栽类

throw newException("加载类库失败");

}

}

[size=10.5pt]?>

这只是实例化两个不同目录下的两个类而已。如果项目中使用面向对象开发的话,类不会那么少,大家可以想像一下。如果要加载数个不同目录下的类,在_ _autoload函数里实现会是多么的麻烦和不灵活。

在这里给出个比较简单的解决方案,而且这个解决方案在很多MVC框架中都得以很好的应用

我们只需要在类的命名方式上做些改变,以类的目录路径为类名:

/Yhmphp/ App.php 里的Mysession类,命名为:Yhmphp_App_Mysession。用‘ _ ’下划线来替换

路径分割符,以相对路径下的目录路径做类名。

又比如根目录下的Lib目录下test.php 文件里面(/Lib/test.php) 有个Myblog 类,可以这样给Myblog类命名:

class Lib_Myblog{}

?>

实例化Lib_Myblog类:

$myblog = newLib_Myblog;

[size=10.5pt]?>

__autoload函数里用str_replace函数把路径分割符替换类名中的‘ _ ’下划线,这样就可以准确的找到Lib_Myblog类的所在文件的路径然后准确的加载了:

function __autoload($class){

$classpath =str_replace('_','/',$class).'.php';

if(!include_once($classpath)){//加栽类

throw newException("加载类库失败");

}

}

[size=10.5pt]?>

模型的路由:

当我们给单入口文件(控制器)index.php

加上了模型选参m(index.php?m=myblog),控制器就会去寻找myblog模型类,并实例化,然后执行myblog模型类中的model 方法,最后执行show方法

来显示视图。

class App_Run

{

publicfunction routing(){

$model =MOBILE_MODEL.'_'.MODEL_SWITCHING.'_'.$_REQUEST['m'];

if(class_exists($model)){

$cake= new $model;

method_exists($cake,'model')&& $cake->model(); //执行模型里面的model 方法

method_exists($cake,’show’)&& $cake->show(); //视图层

}else{

thrownew Exception("数据模型不存在");

}

}

}

[size=10.5pt]?>

常量MBILE_MODEL定义了模型存放的目录名,在这里做了定义方便日后模型目录的更改。这是个良好的习惯。能统一定义的信息就该统一。能模块化的业务逻辑就应该模块化。为日后的项目维护和项目扩展做好铺垫。

MBILE_MODEL

在Config/__Active.php文件里面这样定义:

[php]php

/**

相关文档
最新文档