用户
 找回密码
 入住 CI 中国社区
搜索
楼主: actionbi
收起左侧

[中级] CodeIgniter2.1.0源码阅读(20120427更新)

    [复制链接]
 楼主| 发表于 2012-4-1 00:55:39 | 显示全部楼层

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 赋值
                        }

发表于 2012-4-1 10:54:21 | 显示全部楼层
看到楼主的文章后,觉得自己学习PHP学的太浮澡了!还没有静下心来学习!
同时对楼主的这种奉献精神十分的敬佩!希望在论坛中多涌现一批如Hex和楼主一样的PHPER!
谢谢楼主,让我更深入的了解了CI!
继续强势围观和密切关注!
 楼主| 发表于 2012-4-4 01:40:23 | 显示全部楼层

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 显示

发表于 2012-4-16 22:42:26 | 显示全部楼层
这可是绝对的好帖子啊。。不顶对不起自己,也对不起LZ的辛苦啊
发表于 2012-4-27 15:20:24 | 显示全部楼层
well done
 楼主| 发表于 2012-4-27 18:25:01 | 显示全部楼层

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 */
发表于 2012-5-5 09:05:43 | 显示全部楼层
顶起
 楼主| 发表于 2012-5-6 22:06:06 | 显示全部楼层
现在代码远没有以前看的细心了,检讨下
发表于 2012-5-11 23:07:26 | 显示全部楼层
感谢楼主,非常给力
发表于 2012-5-17 07:50:11 | 显示全部楼层
哦,不错啊,留名了

本版积分规则