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来调用,这样我们的访问之路才畅通起来。
相关文章推荐
- CodeIgniter源码阅读笔记(7)——路由类Router.php
- CodeIgniter框架源码学习之路由类--Router.php
- CodeIgniter源码阅读笔记(4)——性能测试Benchmark.php
- CI框架源码阅读笔记4 引导文件CodeIgniter.php
- CodeIgniter源码阅读笔记(6)——地址解析类URI.php
- CodeIgniter源码阅读(四)(Loader.php)
- CI框架源码阅读笔记4 引导文件CodeIgniter.php
- CodeIgniter源码阅读(三)(URI.php)
- CodeIgniter源码阅读笔记(5)——钩子Hooks.php
- CI框架源码阅读---------Router.php
- CodeIgniter源码阅读笔记(3)——公共函数Common.php
- CodeIgniter源码阅读(6)Hook.php 扩展框架的实现原理
- CodeIgniter框架源码笔记(6)——支持友好的URI地址:路由类Router.php
- CodeIgniter源码阅读URI.php中_fetch_uri_string()函数的解析
- CodeIgniter源码分析之Router.php
- CodeIgniter源码阅读(一)(index.php && CodeIgniter.php)
- CodeIgniter源码分析之index.php
- [PHP源码阅读]trim、rtrim、ltrim函数
- [PHP源码阅读]array_push和array_unshift函数
- CodeIgniter源码分析之CodeIgniter.php