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

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_directoryset_classset_class,下面一句
    $this->set_method(isset($x[1]) ? $x[1] : 'index');
    方法名不存在是返回index,而不是404.

  • 解析路由

    解析routes里设定的路由。_parse_routes的存在就是供_set_request调用的。

  • 设置类、获取类、设置方法、取得方法、设置目录、取得目录

    这几个函数里其实没有太多东西。但是我们缺可以从中看到非常好的面向对象的思想。
    只是为什么set_classset_directory要用str_replace呢?去掉不合法字符?可是URI里已经有一个_filter_uri方法了。我们大概猜测是出于绝对的安全考虑吧。

  • 设置重写

    这个只在CodeIgniter.php里调用过一次,用来设置index.php文件里重写。

应该说Router是整个CI里非常关键的部分,跟URI配合起来解析所有的请求,再交给CodeIgniter来调用,这样我们的访问之路才畅通起来。

你可能感兴趣的:(PHP,CodeIgniter,router)