这篇文章主要介绍CI核心框架工具类CI_URI。
该类主要用来解析uri和决定路由的。关于URI和URL的关系请参考这位朋友的文章。简单来说URI是唯一定位的资源,URL是唯一资源的一个网络可能访问路径。所以从这个角度来看,作者在定义类名的时候还是非常严谨的,因为由于解析路由的存在,同一个资源可能有多个访问路径。
1.__construct()
该构造函数,主要针对enable_query_strings=true的情况作出一些处理。
举例说明:
1)当值为true时候,URL为:http://example.com?a=me&b=something&c=here
2)当值false的时候,URL为:http://example.com/me/something/here
因为在大多数情况下,我们会把enable_query_strings设为false。
在构造函数中,就是针对设为false的时候,针对'REQUEST_URI'和‘QUERY_STRING‘ 两种protocol(规则) 分别处理uri。
2._parse_request_uri()
当protocol参数的值是‘REQUEST_URI‘时候,采用该函数解析uri。
一系列的操作,清理并得出不含‘/’相对路径,例如:http://47.100.9.155/skin/index/start?a=1 返回的uri 是 index/start。
两一个操作是清理和设置$_SERVER['QUERY_STRING']的值,并且把相应的参数存入$_GET数组中。
3._parse_query_string()
当protocol参数的值是‘QUERY_STRING‘时候,采用该函数解析uri。
这个函数与_parse_request_uri的区别是采用$_SERVER['QUERY_STRING']的值来获取uri,并且返回。到底采用_parse_request_uri方法或者_parse_query_string方法来获取uri是由web服务器(如apache,nginx等)的路由配置来决定的。
4._set_uri_string()
该函数是protect 属性,意味着它不能被外部直接调用,只能被内部调用或者被子类继承调用。在这里,暂时只是被构造函数调用。
该函数主要做了以下的事情:
1)移除不可见的字符,和多余的/;
2)如果有之前在框架中设置了文件名后缀,在这里将其移除;比如有可能是一个example文件,非要伪装成静态文件example.html,在这里会将.html去除掉;
3)将各参数挑出来并过滤后存入segments[]数组。
剩下的一些公共函数主要是对uri的一些获取操作,可以参考官方汉化后的文档:https://codeigniter.org.cn/user_guide/libraries/uri.html。