标签:
初学CI框架,由于php基础也没太好,学起来还是有点困难。看了看URI和Router源码,把自己的理解写下来。可能会有理解错误或不道位的地方。慢慢来。
首先CI框架是通过一个入口文件index.php(主要内容是被包含的CodeIgniter.php)来访问,其自身有自己的访问路径规则(主要是通过URI类和Router类对路径进行解析实现)
实例化URI对象,它会执行如下动作(部分)
··获得配置信息对象。
··根据uri_protocol选择调用url解析方法。
··返回解析处理后uri信息格式,如下
controller/function/parameters
··初始化uri_string(string)和segments(array)成员变量。其中,uri_string是uri信息经过ascii过滤后的字符串,segments是从1开始的存储controller,function,parameters的数组。
实例化Router对象,执行如下动作(部分)
··获取配置对象。
··获取URI对象。
··获取routes配置信息。
··判断URI->uri_string是否为空来选择执行方法_parse_routes()或者_set_default_controller()。即判断是否存在选定的controller或是function或param,如果不存在,则调用默认controller。(在此假定存在)
··调用_parse_routes()方法,获取routes配置信息,来判断是否要对uri进行重映射。比如:
若有配置信息$route[‘key‘] = ‘controller/function/111‘,那么当你访问index.php/key时,在此函数中会对uri进行匹配并替换操作成 index.php/controller/function/111
其中有通配符:any和:num分别对应正则[^/]+和[0-9]+,匹配替换和上例类似。
然后将重映射的uri以 ‘/‘ 进行拆分成数组形式,并执行_set_request(array segments[])方法,获取uri中的controller,function和parameters等信息,并对$class,$method等成员赋值。
然后,在CodeIgniter.php中,获取实例化Router对象的$class,$method成员。通过判断$class,$method或者$class中的$method方法是否存在,或是方法名是否以 ‘_‘(下划线)开始等方式 来判断访问方式是否正确,正确则正常执行,不正确则返回404页面。
标签:
原文地址:http://www.cnblogs.com/onyourway/p/4964259.html