作者:feifengxlq
原文地址:http://www.phpobject.net/blog/read.php/95.htm
时间:2007-1-10
很早前就想写一些关于PHP实现MVC的新的体会。今天就开始详细的写写我对MVC的一些理解,以及我在开发过程中实现自己的一个框架的一个流程。其中或许说的不正确,还望指正!
以下是关于这个MVC的文件结构图:
网站关于MVC的教材很多了,我这里不具体说了,不明白的,推荐自己上百度搜索下“MVC",相信可以找到你想要的东西的。这里我谈谈在PHP实际开发中,我对MVC的理解。M,module,主要任务是把数据库或者其他文件系统的数据按照我们需要的方式读取出来。V,view,我的理解是主要负责页面的先是,把数据以html的形式显示给用户。C,controller,主要负责业务逻辑,比如说你要显示登陆界面,就需要调用一个控制器userController的方法loginAction来显示(可能这个不需要调用module),再比如你进行登陆检查就可以调用userController的方法checkAction来进行逻辑处理。(感觉Verdana的指正^_^)。
引用
M是指model。Controller 并不参与业务逻辑,整个业务逻辑部分应该是放在 Model 层中的。Controller 只起到分发请求的作用,也就是说得到当前的 Request,决定调用哪个 Model 获取数据,然后再赋值给哪个 View 来渲染页面
具体实现MVC,我觉得最好还是要做到单点入口。
什么是单点入口呢?所谓单点入口就是整个应用程序只有一个入口,所有的实现都通过这个入口来转发,比如说在上面我们就使用index.php作为程序的单点入口,当然这个是可以由你自己任意控制的。
为什么要做到单点入口呢?单点入口有几大好处:第一、一些系统全局处理的变量,类,方法都可以在这里进行处理。比如说你要对数据进行初步的过滤,你要模拟session处理,你要定义一些全局变量,甚至你要注册一些对象或者变量到注册器里面(主要是实现在全局,具体你可以参考我先前翻译的一些文章《在PHP中使用全局变量》)。第二、程序的架构更加清晰明了。当然好处还有很多的,我也不一一列举了,具体你可以去体会。
当然单点入口也存在一些不足,比如你系统大了后,不可能只一个点做为入口,尤其系统存在两个完全不相关的功能时候,不过很高兴的说,这个是可以扩展,你可以扩展多个入口。比如说在最近一个大项目中,后台的管理和前台是不相关的,所以我就会有两个入口,一个是index.php一个是admin.php。但这不不是说单点入口不好(具体含义你可以揣摩下)。
那么,如何实现单点入口呢?这是我本节的重点。一般来说都是通过url的地址映射实现的(前面我有一篇文章说到这个:《回答PHPCHINA上的几个问题:URL映射》,里面实现了单点入口的核心,这里我具体实现,并演示下)。单点入口最关键的就是通过url传递参数来实现程序的分配,具体说,比如:地址是index.php?controller=test&action=test,这就通过index.php把请求转发到对应的testController文件中,并执行其对应的testAction方法(这里的控制器和方法的命名都参考了Zend Framework的思想)。
下面我们用最简单的方法是来实现上面说的单点入口(记住:简单起见,我这里没有使用URL映射了)
/index.php
<?
/**
* MVC演示demo
* 仅仅实现最基本的MVC功能,不包含安全处理,数据过滤,及其他优化措施。
* @author:feifengxlq
* @since:2007-1-10
* @copyright http://www.phpobject.net/blog/read.php/95.htm
*/
define('SITE_PATH',str_replace('','/',dirname(__FILE__)));//定义系统目录
$controller=(!empty($_GET['controller']))?$_GET['controller']:'index';//获取控制器,默认index
$action=(!empty($_GET['action']))?$_GET['action']:'index';//方法名称,默认index
$controller_name=$controller.'Controller';
$controller_file=SITE_PATH.'/app/controller/'.$controller_name.'.class.php';//获取控制器文件
if(file_exists($controller_file)){
require_once($controller_file);
$controller=new $controller_name();
$controller->{$action.'Action'}();
}else{
die('找不到对应的控制器!');
}
?>
对应的一个演示demo
/app/controller/testController.class.php(注意路径)
<?
/**
* MVC演示demo
* 仅仅实现最基本的MVC功能,不包含安全处理,数据过滤,及其他优化措施。
* @author:feifengxlq
* @since:2007-1-10
* @copyright http://www.phpobject.net/blog/read.php/95.htm
*/
class testController
{
function testAction(){
echo 'Hello,World!';
}
}
?>
打开浏览器,输入http://path/to/yoursite/index.php?controller=test&action=test(注意相应的修改你的路径),如果你看到Hello,World!说明MVC第一步,单点入口成功了!