####Router.php
-
设置路由
CodeIgniter.php里载入并实例化Router类之后就立马运行了
_set_routing
函数。调用URI了的方法处理url,并读取config/routes.php里的设置。 -
设置默认路由
取得在routes里设定的默认位置;既缺省状态下默认访问的类与方法。这一部分跟后面的部分写的很绕。绕到下一个
_set_request
里去处理; -
设置请求
又绕到
_validate_request
里,看下面的代码:
if (file_exists(APPPATH.'controllers/'.$segments[0].'.php'))
{
return $segments;
}
如果我在controllers目录里有一个home.php文件,里面有个index方法;在routes里设置的默认目录是
home/home/home
,实际上也不会出现404,为什么呢?因为我设定的默认路由第一个字段是home,尽管我把它当成一个目录,但是上面的代码显然会找到home.php的文件然后返回。
而
fetch_method
里又是这样写的:
if ($this->method == $this->fetch_class())
{
return 'index';
}
如果类名和方法名相同,返回index。。。那如果我在home.php里写了一个home方法,这样可以访问吗?不能~为什么呢?因为在PHP4里,构造函数和类名同名~(php中的类名和方法名,甚至一些关键字都是不区分大小写的),所以CI要这样处理;第三个字段怎么回事儿呢?从
_set_default_controller
的代码里我们看到了,他只解析两个字段~~~ -
验证请求
检查请求里的class和method是否存在,并做出相应的处理。如果$segments为空,并没有返回空,而是返回$segments。
验证通过的话调用set_directory
、set_class
、set_class
,下面一句
$this->set_method(isset($x[1]) ? $x[1] : 'index');
方法名不存在是返回index,而不是404. -
解析路由
解析routes里设定的路由。
_parse_routes
的存在就是供_set_request
调用的。 -
设置类、获取类、设置方法、取得方法、设置目录、取得目录
这几个函数里其实没有太多东西。但是我们缺可以从中看到非常好的面向对象的思想。
只是为什么set_class
和set_directory
要用str_replace
呢?去掉不合法字符?可是URI里已经有一个_filter_uri
方法了。我们大概猜测是出于绝对的安全考虑吧。 -
设置重写
这个只在CodeIgniter.php里调用过一次,用来设置index.php文件里重写。
应该说Router是整个CI里非常关键的部分,跟URI配合起来解析所有的请求,再交给CodeIgniter来调用,这样我们的访问之路才畅通起来。