会点点代码修改,会各种程序上手运营,会电商,会运营,还会吃点喝点!*_*
当前位置:首页- emlog MVC解构5 - Dispatcher和路由表分析

emlog MVC解构5 - Dispatcher和路由表分析

作者:李元波发布时间:2024-12-12 08:37分类: 日常 浏览:6评论:0


导读:注意:前台MVC结构功能主要是向服务器请求数据,只有评论是提交数据。Dispatcher:路由分发器,可谓是emlog MVC结构的关键。所谓路由,就是确定到达目的的最佳路径和通过...

注意:前台MVC结构功能主要是向服务器请求数据,只有评论是提交数据。

Dispatcher:路由分发器,可谓是emlog MVC结构的关键。
所谓路由,就是确定到达目的的最佳路径和通过网络传输信息。

在emlog里面,路由分发器的作用与路由类似:
路由分发器获取到目的路径,通过正则表达式等判断,获得需要调用的Controller、方法及参数。
Controller获取数据后把数据发送给相应的模型,模型处理好相应的数据后有存储到数据库里面或者更新缓存和变量,最后Controller将信息传递给View,进行输出。

下面详细解析Dispatcher类:
属性列表:

属性 注释
static $_instance 静态属性,保存一个实例化的Dispatcher对象
private $_model 目标请求模块,保存Controller的类名
private $_method 目标请求模块方法,保存Controller调用的方法名
private $_params 目标请求参数,保存正则表达式获取的路径和路径分量构成的一个数组
private $_routingTable 路由表,保存通过Options::getRoutingTable()的静态方法返回的路由表,为二阶数组
private $_path 访问路径,函数处理后不包含 BLOG_URL和index.php的路径


方法列表:

方法 注释
private function __construct() 构造方法,调用setPath()方法配置$_path,获取$_routingTable,迭代分析路由表数据,利用正则表达式判断配置$_model,$_method,$_params
public static function getInstance() 静态方法,实例化静态属性$_instance并返回
public function dispatch() 实例化$_model对象,并调用$_method方法,参数为$_params
public static function setPath() 静态方法,返回去除干扰项的路径$path


下面分析一下所谓的路由表:

$routingtable = array(
    array(
        'model' => '模型的名称',
        'method' => '调用的方法',
        'reg_0' => '正则表达式',
        'reg_1' => '正则表达式',
        ...
    ),
    ...
);

容易发现除了calendar,所有的model都是Controller,在类文件include/controller路径下。
calendar是一个工具类,在include/lib下面,你可以通过

BLOG_URL.'?action=cal'

获得一个个性化的日历。例如http://www.liyuanbo.cn/?action=cal

method就是将要调用的方法,reg_*就是正则表达式啦,和isurlrewrite参数有关,但reg_0是默认的路径,如果路径无法匹配'reg_'.Option::get('isurlrewrite')所对应的表达式,但能匹配reg_0所对应的表达式则依旧可行,前者优先匹配。
正则表达式具体如何匹配就不分析了,自己看。

提供简单方法查看处理后的路径调用的是哪个Controller,方法和参数,修改dispatch()方法为:

public function dispatch(){
    $module = new $this->_model();
    $method = $this->_method;
    print '$_path:'.$this->_path."<br>".
          '$_model: '.$this->_model."<br>".
          '$_method: '.$this->_method."<br>".
          '$_params: ';
    print_r($this->_params);
    $module->$method($this->_params);
}

 

可以通过改变访问路径不断验证理解的正则表达式是否正确。

标签:


发表评论: