CI3的routes.php中详细介绍路由匹配规则

  1. 初步介绍:

CI中路由全称为URI路由,即通过解析URL中不同段的值,来将用户输入,访问的URL地址对应成指定Controller的指定方法,并传入参数的过程。例如: http://example.com/class/function/id/param, 通过CI自带的路由解析器,即将class,function,id,param等解析为对应的Controller::function(id,param),如上为例,CI提供了极为灵活的行式路由方式,即通过对应文件的每一行指定某个特定模式的路由,从而实现路由映射。

  1. 路由映射方式

在application/config/routes.php文件中,我们可以自行配置CI的路由规则,只需遵从指定的语法,如$route[‘xxx/xxx’] = ‘xxx/xxx’; 即可完成路由配置的过程,同时行式路由具有前者优先的规则,即声明在前的路由规则优于其后的规则。同时,我们还可以通过通配符+正则表达式的方式扩展路由的灵活性,详解如下:

2.1 通配符:CI中,通配符主要为(:num)和(:any)两种,前者仅匹配对应的数字,后者则匹配任意的字符,例如

$route['test/(:num)'] = 'testController/searchById/$1';

即将(:num)对应的数字传给了searchById方法作为参数,而在searchById方法中,通过$this->uri->segment(3)来获取uri分段中的第三段(即对应的$1), 即可成功将uri和指定的方法+参数进行绑定。

2.2 正则表达式:CI中也可以通过正则表达式来进行路由的匹配,如

$route['test/search/(\d+)'] = 'testController/searchById/$1';

的匹配形式,与通配符类似,同时,也可以将通配符和正则表达式混用,进一步提高路由配置效率。

2.3 回调函数:CI中也能通过回调函数进行路由逆调用,将URI的各段作为回调函数的参数进行调用,例如:

$route['test/(:any)/id/(:num)'] = function($testParam,$id)
{
     return 'testController/test/'. $testParam.'/'. $id ;
}

的方式,通过回调进行参数的映射。
2.4 HTTP动词:现行通用的RESTful架构中,通过HTTP的保留动词来进行自定义的参数对应。同时,这些动词仅作为标记用,不做任何实际用途。例如:

$route['products']['put'] = 'product/insert';

中,put段不做实际用途,仅表明本方法为HTTP的put方法,即插入数据而已。

  1. 路由机理:

上文中主要介绍了应用方式,即路由的几大规则和对应方法,本节中,将通过剖析CI源代码,来详细阐述CI路由的核心实现方法。

CI的路由代码主要为system/core/Router.php中所定义的CI_Router类的内容,其中,通过__construct()函数可以发现一些端倪

$this->config =& load_class('Config', 'core');
$this->uri =& load_class('URI', 'core');
//略	
$this->_set_routing();
//略
log_message('info', 'Router Class Initialized');

其中_set_routing()函数的主要内容为:

3.1 查询routes.php文件是否存在

3.2 加载文件中 r o u t e 数组的内容,并存储至 route数组的内容,并存储至 route数组的内容,并存储至this->routes成员中

3.3 根据 r o u t e 存储的内容,利 用 p a r s e r o u t e s ( ) 函数进行控制器方法参数的拆分,并将真正需要访问的类和方法存入 route存储的内容,利用_parse_routes()函数进行控制器方法参数的拆分,并将真正需要访问的类和方法存入 route存储的内容,利parseroutes()函数进行控制器方法参数的拆分,并将真正需要访问的类和方法存入this->class,和$this->method中,这一步中,将通过对上文所述的通配符转化为正则表达式,并通过正则表达式的形式来进行对应:

$key = str_replace(array(':any', ':num'), array('[^/]+', '[0-9]+'), $key);//通配符转换为正则
if (preg_match('#^'.$key.'$#', $uri, $matches)) // 正则匹配 

3.4 结束,并设置调用响应给CodeIgniter.php,通过:

$class  = $RTR->fetch_class();
$method = $RTR->fetch_method();
$CI = new $class();

进行加载类的成员并实例化。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值