从封闭的大学出来,重新接触到着时时都在变化的社会的时候,不禁流下了眼泪,同时站在原地感叹着这世界。从哥哥那里听说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