您的位置:首页 > 编程语言 > PHP开发

CodeIgniter源码阅读(二)(Router.php)

2012-12-10 09:42 363 查看

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来调用,这样我们的访问之路才畅通起来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: