PHP实现简单MVC构想

   对于现在的应用程序来说,从基础的写起的时代已经远去了,更多的是从架构,可扩展性以及可维护性上来考虑了。因此也产生了很多的框架,尤其在开源世界算的 上是百花齐放的景象。各种各样的模式和架构到处都是,对于现在的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等等,都是很不错的框架,都可以用来参考。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值