emlog MVC解构5--Dispatcher和路由表分析
注意:前台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.qingzz.cn/?action=cal或http://www.qingzz.cn/index.php?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); }
可以通过改变访问路径不断验证理解的正则表达式是否正确啦~
点赞1
支持一下