actionbi 发表于 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 赋值
                        }

fltn03 发表于 2012-4-1 10:54:21

看到楼主的文章后,觉得自己学习PHP学的太浮澡了!还没有静下心来学习!
同时对楼主的这种奉献精神十分的敬佩!希望在论坛中多涌现一批如Hex和楼主一样的PHPER!
谢谢楼主,让我更深入的了解了CI!
继续强势围观和密切关注!

actionbi 发表于 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 显示

80后奔三ing 发表于 2012-4-16 22:42:26

这可是绝对的好帖子啊。。不顶对不起自己,也对不起LZ的辛苦啊

Jason_Gian 发表于 2012-4-27 15:20:24

well done

actionbi 发表于 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

顶起

actionbi 发表于 2012-5-6 22:06:06

现在代码远没有以前看的细心了,检讨下

wudianni 发表于 2012-5-11 23:07:26

感谢楼主,非常给力

莫若离 发表于 2012-5-17 07:50:11

哦,不错啊,留名了
页: 1 [2] 3 4
查看完整版本: CodeIgniter2.1.0源码阅读(20120427更新)