设为首页 收藏本站
查看: 864|回复: 0

[经验分享] CI框架源码阅读笔记8 控制器Controller.php

[复制链接]

尚未签到

发表于 2015-8-24 10:32:24 | 显示全部楼层 |阅读模式
    最近时间有些紧,源码阅读系列更新有些慢。鉴于Controller中代码比较少,本次Blog先更新该文件的源码分析。
    在经过路由分发之后,实际的应用Controller接管用户的所有请求,并负责与用户数据的交互。CI中所有的应用控制器都应该是CI_Controller的子类(除非你扩展了CI的核心,那么你的Controller父类可以是MY_Controller)。
    在应用程序控制器中,我们经常会用到这样的代码:



/* 加载配置文件 */
$this->load->config("config_app");
/* 加载model */
$this->load->model("user");
/* 加载视图 */
$this->load->view("index");
/* 获取post */
$this->input->post("data",true);
/* 获取 get */
$this->input->get("data",true);
/* 清除xss */
$this->security->xss_clean($data);
/* mark时间点 */
$this->benchmark->mark("app_start");

  这些是如何实现的?我们接下来就简单跟踪一下。
  尽管该类的结构很简单,我们还是贴出CI_Controller的类图:
DSC0000.jpg

1.  _contruct()  构造函数
  这里CI做了一个处理,将所有的已经加载的组件加入CI_Controller(前面我们已经看到,is_loaded函数追踪所有加载的组件):



foreach (is_loaded() as $var => $class)
{
$this->$var =& load_class($class);
}

  看看Controller实例化时,is_loaded追踪的组件有哪些:
DSC0001.jpg
  这就解释了为什么我们可以通过$this->input等方式来调用CI的组件。
  这还不够,顺便把Loader也搞进来:



$this->load =& load_class('Loader', 'core');
$this->load->initialize();

  现在,可以使用Loader组件来加载配置($this->load->config),加载模型($this->load->model) 和加载视图了($this->load->view)
  CI_Controller可以说是一个持有多个组件的超级类,这样的方式,非常类似于设计模式中的"代理模式"。

2.  &get_instance
  这里简单解释一下,CI_Controller是一个单例模式的类,通过get_instance()方法获得该类的实例。CodeIgniter.php中get_instance函数调用的即是该方法:



public static function &get_instance()
{  
return self::$instance;
}

  以下是关于Controller的一些Hint:
  1.  CI中Controller中可以自定义目录,例如在application/controller目录中创建目录admin,并新建IndexController,则该Controller的URL访问路径是:



test.xq.com/admin/index/
  2.  Controller中不应该承担过多的逻辑,业务逻辑应该封装到Model中.
  3.  你的Controller应该按照业务区分,例如UserController处理用户相关的请求,而AppController处理应用的请求等,这不是原则,而只是一种方式。
  4.  Controller类名应该以大写字母开头,文件名应该是全小写的形式。
  5.  Controller中以下划线开头的方法被CI认为是私有方法,不能够被外部直接访问。
  以上就是Controller的全部内容了。
  最后,还是贴出CI_Controller的源码:



class CI_Controller {
private static $instance;
/**
* Constructor
*/
public function __construct()
{
self::$instance =& $this;
foreach (is_loaded() as $var => $class)
{
$this->$var =& load_class($class);
}
$this->load =& load_class('Loader', 'core');
$this->load->initialize();
log_message('debug', "Controller Class Initialized");
}
public static function &get_instance()
{
return self::$instance;
}
}

本文的参考文献:


  • http://blog.163.com/wu_guoqing/blog/static/196537018201281663649361/
  • http://codeigniter.org.cn/user_guide/database/helpers.html

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-103337-1-1.html 上篇帖子: IIS8 使用FastCGI配置PHP环境支持 过程详解 下篇帖子: 分页程序设计理解page.class.php
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表