CI源码阅读Router.php 设置路由
$RTR =& load_class('Router', 'core');$RTR->_set_routing();
// Set any routing overrides that may exist in the main index file
if (isset($routing))
{
$RTR->_set_overrides($routing);
}
代码阅读到了CodeIgniter的171行-178行。看看这几行做了什么呢?
设置路由
class CI_Router {
变量:
var $config;
var $routes = array(); //路由规则数组,值来自APPPATH/config/route.php
var $error_routes = array();
var $class = '';//URI中的Controller
var $method = 'index';//URI中显示调用的函数,默认为index()
var $directory = '';//URI中现实的目录信息
var $default_controller; //默认控制器
构造函数:
function __construct()
{
$this->config =& load_class('Config', 'core');//加载并实例化Config类
$this->uri =& load_class('URI', 'core');//加载并实例化URI类
log_message('debug', "Router Class Initialized");
}
成员函数
function _set_routing()//设置默认的路由信息,如果不存在控制器信息,则根据routes.php的设置来加载默认的控制器,
function _set_request($segments = array())//这个方法以一个数组输入来调用set_class和set_method来
function _validate_request($segments)//检查是否在uri中包含了文件夹信息,如果包含,则将其值赋给属性$directory
function _parse_routes()//处理路由,根据路由设置APPPATH/config/routes.php来
function set_class($class)//设置控制器类
function fetch_class()
function set_method($method)//设置控制器方法
function fetch_method()
function set_directory($dir)//设置文件夹
解读函数的实现过程:
function _set_routing(){
1、当配置文件中config['enable_query_strings'] ==TRUE AND urI中设置了自定义的控制器的标识时候会使用fetch_directory()set_directory()set_class()fetch_class()set_method()fetch_method()完成对路由的的设置。返回一个segment的数组
2、如果不执行1中的操作,那么意思就是传过来的是URI类中的$uri_string.那么函数就会执行一系列的操作,将字符串切割成,URI的片段数组。然后经过function _parse_routes();set_request()设置Router类中的$class,$method,$directory
}
validate_request(){
设置控制器,控制器方法,同时给$this->uri->rsegments 赋值
}
看到楼主的文章后,觉得自己学习PHP学的太浮澡了!还没有静下心来学习!
同时对楼主的这种奉献精神十分的敬佩!希望在论坛中多涌现一批如Hex和楼主一样的PHPER!
谢谢楼主,让我更深入的了解了CI!
继续强势围观和密切关注!
CI源码阅读 Output类 输出类
类成员变量
var $final_output;
var $cache_expiration = 0;
var $headers = array();
var $enable_profiler = FALSE;
类方法
function get_output() //获取$final_output 的值
function set_output($output) //给 $final_output 赋值
function append_output($output)//附加输出的内容
function set_header($header, $replace = TRUE)//设置要发送的header到数组属性 $headers
function set_content_type($mime_type)//设置Content-Type
function set_status_header($code = '200', $text = '')//设置状态码
function enable_profiler($val = TRUE)//允许你开启或禁用评测器
//评测器将在页的底部显示测试基准点或调试、优化需要的其他数据
function cache($time)//设置缓存以及缓存时间 ,以分钟为单位
function _display($output = '')
{
//这个方法将生成并输出至客户端,
如果开启了profiler则在页尾添加性能分析结果,
如果设置了缓存,则调用缓存文件
}
function _write_cache($output)
{
//知道设置的cache目录,如果不存在的话,设置缓存目录为APPPATH/cache
$uri = $CI->config->item('base_url').
$CI->config->item('index_page').
$CI->uri->uri_string();
$cache_path .= md5($uri);
//生成的缓存文件路径为$cache_path
//根据设置的缓存时间写缓存文件.
}
function _display_cache(&$CFG, &$URI)
//显示缓存文件,根据url寻找文件(md5加密形式的文件名),如果存在则显示,如果过期,则删除
// 如果没有过期那么调用_display 显示
这可是绝对的好帖子啊。。不顶对不起自己,也对不起LZ的辛苦啊 well done
Input类,定义数据处理的操作
本帖最后由 actionbi 于 2012-4-27 18:27 编辑class CI_Input {
var $ip_address = FALSE; //当前用户的ip
var $user_agent = FALSE; //当前用户的user_agent
var $_allow_get_array = TRUE;//是否允许使用$_GET,如果false,那么清除$_GET
var $_standardize_newlines = TRUE;
var $_enable_xss = FALSE; //是否对数据进行XSS过滤
var $_enable_csrf = FALSE;//是否进行csrf保护,如果为真 ,那么会设置一个token值
protected $headers = array(); //http头信息
public function __construct()
{
//从配置文件中获取是否进行全局允许使用$_GET XSS过滤和csrf保护
//清除globals变量,在开启了globals_register的情况下,相当于关闭了此配置。
开启一道 安全防护
}
function _fetch_from_array(&$array, $index = '', $xss_clean = FALSE){
//从$array获取值,如果设置了xss_clean 那么进行过滤}
function get($index = NULL, $xss_clean = FALSE){//获取过滤后的$_GET数组}
//获取过滤后的$_POST数组
function post($index = NULL, $xss_clean = FALSE){}
获取post数组,如果没有从get获取
function get_post($index = '', $xss_clean = FALSE){}
function cookie($index = '', $xss_clean = FALSE)
{//返回过滤后的cookie值}
function set_cookie($name = '', $value = '', $expire = '', $domain = '', $path = '/', $prefix = '', $secure = FALSE)
{//设置cookie,其中会从config.php中加载预设配置}
function server($index = '', $xss_clean = FALSE)
{//获取$_SERVER中的项目,可以决定是否经过xss过滤}
function ip_address()
{//获取当前用户的ip
}
function valid_ip($ip) {}//验证ip的正确性
function user_agent()
{ } //获得user_agent一般user_agent为空的时候被认定为手机访问,或者curl的抓取,或则会蜘蛛抓取
function _sanitize_globals()
{//一道很强的安全屏障
Unset globals for securiy.
// This is effectively the same as register_globals = off
同时还会过滤 $_GET $_POST $_COOKIT 的键值和value值}
function _clean_input_data($str)
{ // 过滤输入的值}
function _clean_input_keys($str)
{过滤键值 }
public function request_headers($xss_clean = FALSE)
{//设置$this->header}
public function get_request_header($index, $xss_clean = FALSE)
{// 获取http 头信息,如果设置xxs_clean了则过滤}
public function is_ajax_request()
{ //判断是否为ajax请求}
public function is_cli_request()
{ //判断是否来自cli请求}
}
/* End of file Input.php */
/* Location: ./system/core/Input.php */ 顶起 现在代码远没有以前看的细心了,检讨下 感谢楼主,非常给力 哦,不错啊,留名了