|
本文分析了Zend Framework框架路由机制代码。分享给大家供大家参考,具体如下:
在框架中,有关路由的调用关系为:
1、apache的mod_rewrite模块把请求路由到框架的启动脚本,一般是index.php;
2、前端控制器Zend_Controller_Front通过dispatch函数进行请求分发;
3、路由器Zend_Controller_Router_Rewrite通过route函数处理路由,对路由器中已有的路由规则,按照加入顺序的逆序(类似于栈,后进先出)对每个route调用match函数,以检查请求是否和当前路由规则匹配,如果匹配的话把路由器的当前路由这个变量($_currentRoute)设置为匹配的路由,并把route解析出来的参数传给Zend_Controller_Request_Http对象,到这里完成路由设置。
如果没有发现路由,框架会使用Index控制器的index这个action。
对Zend_Controller_Router_Route中的函数代码分析:
1、构造函数
public function __construct($route, $defaults = array(), $reqs = array())
{
$route = trim($route, $this->_urlDelimiter); //去掉规则首尾的url分隔符(默认是/)
$this->_defaults = (array) $defaults; //默认值数组,以变量名为键
$this->_requirements = (array) $reqs; //变量需要满足的正则表达式,以变量名为键
if ($route != '') {
foreach (explode($this->_urlDelimiter, $route) as $pos => $part) {
//把规则切分为一个数组
if (substr($part, 0, 1) == $this->_urlVariable) {//如果是一个变量的定义
$name = substr($part, 1); //获取变量名
//如果该变量定义了对应的正则表达式,则获取该表达式,否则置为null
$regex = (isset($reqs[$name]) ? $reqs[$name] : $this->_defaultRegex);
//_parts数组包含了规则的各个部分,如果是变量的话,数组中有name元素
$this->_parts[$pos] = array('name' => $name, 'regex' => $regex);
//_vars包含了该规则中的所有变量的名字
$this->_vars[] = $name;
} else { //普通字符串
$this->_parts[$pos] = array('regex' => $part);
if ($part != '*') {
$this->_staticCount++; //该规则的普通字符串的个数
}
}
}
}
}
|
|