Li Yuan Bo
啥都会点……-李元波
注意:前台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);
}
可以通过改变访问路径不断验证理解的正则表达式是否正确。
标签:emlog
发表评论: