CI框架(CodeIgniter)使用技巧和步骤小结(二)

作者:掠影
最后编辑时间:2017-05-02 22:05:41
浏览次数:1928



    上一篇中谈到了MVC的基本思路模式,以及CI中MVC的应用方法,本节主要谈谈CI框架中,对于路由的控制方式。


    1. 初步介绍:

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


    2. 路由映射方式

        在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方法,即插入数据而已。

    3. 路由机理:

    上文中主要介绍了应用方式,即路由的几大规则和对应方法,本节中,将通过剖析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 加载文件中$route数组的内容,并存储至$this->routes成员中

        3.3 根据$route存储的内容,利用_parse_routes()函数进行控制器方法参数的拆分,并将真正需要访问的类和方法存入$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();

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

    以上为CI中路由的使用技巧和机理小结,本文既是总结,也希望为需要这些知识的朋友提供便利。谢谢

    下节主要进行CI框架中控制器(Controller)机制的分析和小结,敬请期待。

取消

感谢您的支持,我会继续努力的!关闭

扫码支持
大家有钱的捧个钱场,没钱的捧个人场233333

打开支付宝扫一扫,即可进行扫码打赏哦

分享到: QQ空间 更多



评论区

  • 180.167*****: 2017-05-03
    666