实现自己的MVC框架(php) 1

来源:互联网 发布:java中格式化字符串 编辑:程序博客网 时间:2024/05/16 08:20

    从封闭的大学出来,重新接触到着时时都在变化的社会的时候,不禁流下了眼泪,同时站在原地感叹着这世界。从哥哥那里听说MODE2和MVC的概念,到开始看MVC的文章,又到现在的想法,我又感觉到了久违的热情,呵呵。在了解到MVC模型的可行性后,我打算将MVC应用于自己的毕业设计(WEB交易平台),这本身就是个很好的实践机会。网上有很多PHP实现MVC的文章,也有很多实现好的框架,但是还是自己写可以体会到MVC的内涵(其实是懒的看那头疼的英文文档 : P),所以打算自己写一个MVC框架,暂时叫他Pitt吧,下面是Pitt的框架概述:
FrontControler-+->ActionManager1-->[ActionNode-->ActionNode]-->PageMaker
                      |
                     +->ActionManager2-->.........
                      |
                     +->ActionManager3-->.........

FrontControler实现了MODE2里的FrontControler
    根据用户请求调用不同的行为,一个行为又多个ActionNode组成

ActionManager实现了Controler
    控制,管理,调用ActionNode链和PageMaker

ActionNode链实现了Moudle
    实现逻辑的地方,比如数据库操作,排序,运算等等

PageMaker实现了View
    根据.tpl文件生成HTML,发给客户端

ActionNode是逻辑的最小单位,比如登陆这个行为,刚开始我的登陆请求需要Name和Password,为此,我需要建立一个ActionNode,取名为CheckNamePassNode,并且覆盖_execute方法,实现Name和Password的正确性检查,后来,由于验证码流行,我就可以采用两中方法实现验证码检测功能
    1、派生CheckNamePassNode类,重写_execute方法。
     class AdvCheckNamePassNode extends CheckNamePassNode
     {
        .....   
        function _execute($parameter)
        {
            
            if(...)            //这里检查验证码的准确性
            {
                parent::_execute($parameter);    //调用超类的_execute方法,完成原有的
                                                 //Name和Password的正确性检测
            }
            else
            {
                ...                              //验证码错误
            }
        }
     }
    2、新建一个ActionNode,取名为CheckNumberNode
        class CheckNumberNode extends ActionNode
        {
            ...
            function _execute($parameter)
            {
                ...                        //这里完成对验证码的检查
            }
        }
       然后在ActionManager的配置文件里添加这个ActionNode,并且部署在CheckNamePassNode之前

下面我把我已经写完的几个类代码帖出来,由于没有对这些类有真正明确的定义,所以代码可能随时会改变


FrontControler.php

<?php
require "request//Get.php";
class FrontControler
{
 var $_KEY="do";
 var $AMF;
 var $ACTIONMAPPING;
 var $action;

 function setKey($k)
 {
  $this->_KEY=$k;
 }
 
 function setAMF($f)
 {
  $this->AMF=$f;
 }

 function getAMF($f)
 {
  return $this->AMF;
 }

 function getKey()
 {
  return $this->_KEY;
 }
 
 function setACTIONMAPPING()
 {
  $amf=$this->AMF;
  if(file_exists($amf))
  {
   require $amf;
   return TRUE;
  }
  else
   return FALSE;
 }
 
 function getACTIONMAPPING()
 {
  return $this->ACTIONMAPPING;
 }

 function launchActionManager($am)
 {
  if(!empty($am))
  {
   $clsfl=$am.".php";
   if(file_exists($clsfl))
   {
    require $clsfl;
    $actMng=new $am;
    $actMng.init($this);
    $actMng.start();
    return TRUE;
   }
   else
   {
    return FALSE;
   }
  }
 }
 function getActionManagerNameFromKey($k)
 {
  if(!empty($k))
  {
   if(array_key_exists($k,$this->ACTIONMAPPING))
   {
    return $this->ACTIONMAPPING[$k];
   }
   else
    return FALSE;
  }
  else
   return FALSE;
 } 
 function getRequestActionName()
 {
  $sk=$this->_KEY;
  if(array_key_exists($sk,Get::getGET()))
  {
   return Get::getValue($this->_KEY);
  }
  else
  {
   return FALSE;
  }
 }
 function getRequestData()
 {
  return $_POST;
 }

 function _init()
 {}
 function _execute()
 {       /*TODO HERE*/        }
}

?>


get.php            //封装了$_GET

<?
class Get
{
    function getValue($key)
    {
        return $_GET[$key];
    }
    function getGET()
    {
        return $_GET;
    }
    function keyExist($key)
    {
        if(array_key_exist($key,$_GET))
            return TRUE;
        return FALSE;
    }
}
?>

Post.php            //封装了$_POST

<?
class Post
{
    function getValue($key)
    {
        return $_POST[$key];
    }
    function getPost()
    {
        return $_POST;
    }
    function keyExist($key)
    {
        if(array_key_exist($key,$_POST))
            return TRUE;
        return FALSE;
    }
}
?>

Request.php                  //封装了$_GET和$_POST的合集
<?
class Request
{
    var $request;
    function Request()
    {
        $this->Request=$_POST+$_GET;
    }
    function getValue($key)
    {
        return $this->Request[$key];
    }
    function keyExist($key)
    {
        if(array_key_exist($key,$this->Request))
            return TRUE;
        return FALSE;
    }
}
?>

Parameter.php                //实现了参数类,是ActionNode间传递的东西

<?
class Parameter
{
    var $para;
    function addParameter($key,$value)
    {
        $this->para[$key]=$value;
    }
    function removeParameter($key)
    {
        if($this->isExists($key))
        {
            $keys=array_keys($this->para);
            $index=array_search($key,$keys);
            array_splice($this->para,$index,1);
        }
    }
    function isParameterExists($key)
    {
        if(array_key_exists($key,$this->para))
            return TRUE;
        return FALSE;
    }
    function getPara()
    {
        return $this->para;
    }
    function makeParameter($oa)
    {
        $this->para=$oa;
    }
}
?>



以上几个类我觉得问题不大了,其实我自己也比较模糊,呵呵,边写边完善吧

2005年2月20日  2:08:50