您的位置:首页 > 编程语言 > PHP开发

PHP实现简单MVC构想

2007-10-15 15:31 281 查看
对于现在的应用程序来说,从基础的写起的时代已经远去了,更多的是从架构,可扩展性以及可维护性上来考虑了。因此也产生了很多的框架,尤其在开源世界算的 上是百花齐放的景象。各种各样的模式和架构到处都是,对于现在的web开发来说,mvc(Model-View-Controller)还是很常用使用的 一个模式。很多框架都是围绕这一模式,比如java的struts,还有spring也提供自己的mvc。这里不介绍java的,只是用PHP实现一些简 单mvc的构想,想法来自于zend framework(出自于官方php开发团队),有兴趣的朋友可以去 http://framework.zend.com/ 看看。

大概的想法如下,把url请求映射到某个类的某个方法上去,比如http://localhost/book/view/,对应到 BookController的viewAction方法。首先要在工程目录下建.htaccess,里面实现url重定向,这里需要url- rewrite模块,没有的话就需要自行编译下。
RewriteEngine on # 开启rewrite
RewriteRule !/.(js|ico|gif|jpg|png|css)$ index.php # 把不是这些url请求重定向到index.php
在index.php 里可以通过$_SERVER['REQUEST_URI']来获取url请求,可以通过分割/字符来获取所有细节。如果没有rewrite模块这里也可以 通过分割$_SERVER['PATH_INFO']来实现,上面的url也换成http: //localhost/index.php/book/view/。部分代码可以参考如下:
// 通过正则来分割字符,并返回没有空字符的数组。可以用print_r来打印下具体结果。
$uri = preg_split("////", $_SERVER['REQUEST_URI'], -1, PREG_SPLIT_NO_EMPTY);
$controller = $uri[1];
$action = $uri[2];
if(!isset($controller)){
$controller = "Index";// 如果没有controller参数可以定向到默认的Index
}
$controller .="Controller";
if(class_exists($controller)){ // 判断该$controller类是否存在
if(!isset($action)){ // 如果没有action参数可以定向到默认的indexAction
$action="index";
}
$action.="Action";
if(method_exists($controller, $action)){ // 判断该类是否有action方法
$a = new $controller; // 初始化controller类
$a->$action(); // 调用action
}else{
echo "/$controller/$action 该方法不存在 ";
}
}else{
echo "/$controller 页面不存在 ";
}
这些只是简单的分割以及判断的程序片段,下面可以做一些简单的测试代码:
class IndexController{
function indexAction(){
echo get_class($this)."首页";
}
}
class BookController{
function indexAction(){
echo get_class($this)."----------index action----------<br>";
}
function viewAction(){
echo get_class($this)."----------view action----------<br>";
}
}

上面的这些可以把url请求过来的字符可以映射到某个类和方法上去,算起来应该是个比较简单的controll了。代码只是片段,还有很多需要完善的部分,比如对于到文件当中的类,项目总不能把所有的类和方法都写到一个文件里把。

实现了简单的controll,下面就来说说view部分,这里没有什么考虑的,直接采用现有的资源,手头的选择有两种:PHPLib Template和Smarty,当然还有个FastTemplate。PHPLib Template比较简单,在lib里面只有一个template.inc,在项目中引用即可,很简单好用,速度也很快,当然简单也有不好的地方,比如功 能比较单一,只是简单的变量替换等等,Smarty是php官方推荐的,最大的有点就是提供了缓存,可以在页面请求的时候判断下是否有缓存文件,这样速度 会有大幅度的提升。下面是两种模板的一些示例代码:
PHPLib Template:
require_once('template.inc');
$tpl=new Template("."); // 初始化模板方法,.表示在模板文件夹是当前目录
$tpl->set_file("result","test.tpl"); // 把test.tpl 转到 result句柄上
$tpl->set_var("name","smallfish"); // 给变量name赋值
$tpl->parse("out","result"); // 把句柄result转到out变量
$tpl->p("out");// 输出
对应的test.tpl:hello,{name}!

Smarty:
define('SMARTY_DIR','./Smarty/'); // 定义SMARTY_DIR Lib目录
require_once(SMARTY_DIR.'Smarty.class.php');
$smarty = new Smarty; // 初始化类
$smarty ->template_dir = './templates/'; // 这些是制定的目录,默认也是这些目录
$smarty ->compile_dir = './templates_c/';
$smarty ->config_dir = './configs/';
$smarty ->cache_dir = './cache/';
$smarty ->assign('name', 'smallfish'); // 变量处理
$smarty ->display('test.tpl'); // 输出
对应的test.tpl:hello,{$name}!

具体详细的使用可以参见各种的参考手册。

而Model部分,最简单的就是使用封装一套数据库的类库,实现数据库的查询以及更新等操作。PHPLib自带的db_mysql.inc很不错,有点类 似于java的设计。有的时候Model逻辑部分都写在Action里面了,不过最好还是分开,在Model里面实现具体的增删改查等操作,并返回数组或 者对象给Action,这样结构很清晰,也是mvc设计的初衷。现在很多Model都采用ORM的方法,实现了数据库表对应到Object的操作,虽然这 里不是怀疑各种ORM的效率以及其他,很多时候还是觉得直接用sql来的直接,而且效率也高,而把Model详细到当个文件当中,相信维护起来也并不是很 困难。

以上的这些只是个人一些构想,要写一个框架还需要很多的地方要去完善。PHP做为快速开发的代表语言,各种架构框架也多如牛毛,官方的zend framework,其他的如cakephp等等,都是很不错的框架,都可以用来参考。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: