CI的MVC实现

CI被标榜为一款简单易用的框架,经过一段时间的了解后,它的小而精给让我印象深刻.麻雀虽小五脏俱全,一个框架产品包含太多的特性,这篇文章就说说CI中是如何实现MVC的?

执行流程

根据CI手册上提供的应用程序流程图,我们可以清晰地知道,要实现基本的MVC我们所需要的知识点是有以下几点:

  • 定义处理路由
  • 定义处理逻辑
  • 业务逻辑所需要依赖的模型/库
  • 返回的视图

而其他部分CI帮我们已经建立好了或在MVC搭建完成后可再完善,接下来就分别讨论以上几个点在CI中是怎么实现的.

路由

在CI中,路由设置的很简单,它是以请求URI分段显示路由的,如何使用[URI 分段](file:///Users/will/Documents/codeigniter_user_guide/general/urls.html)在手册中已经说明的很清楚了,这里就来说说它的源代码是如何实现的.

CI的核心源代码并没有用大量的面向对象来完成,所以我们沿着一条主线(上面的流程)跟下去,就都可以找到各个部分在哪,以及它是如何完成的.整个框架的处理逻辑是system/core/CodeIgniter.php.路由的处理则在其308行引入了Router.其中最重要的是\CI_Router::_set_request这里就清晰地展示了类与方法是如何得到的.

Controller

由路由解析后,就可以找到相应的Controller,处理过程确实是简便的.这里的处理逻辑是依据不同的业务而来,代码各不相同,这里就说说Controler中遇到的问题,在CI中如何解决的.在此之前还是现看看手册--控制器.

1.调用模型

\CI_Controller::__construct$this->load(system/core/Loader.php)就是在Controller中所需的载入方法,它包含了所有可能用到的方法.所以,载入模型就这样使用:

$this->load->model('model_name');

而其他的,需与其他类或方法进行通信的函数都是可通过$this->load完成,当然了,要让使用起来得心应手还得熟悉system/core/Loader.php的代码.

2.传递至View

毫无疑问,这一点也是通过$this->load完成的

$this->load->view('name');

如何使用就不啰嗦了,请看手册

其实,到这里,我们应该可以体会到CI的确很简单,源代码的学习也不难.

Model

模型这一层只与Controller交互,调用的方法上文也提到了,这里不再赘述.在官方示例中:

    $this->load->model('blog');

    $data['query'] = $this->blog->get_last_ten_entries();

当使用load载入一个Modle后, 可直接使用$this->blog来获取该Model,为什么?

\CI_Loader::model中,每载入一个模型都会成为Controller的一个属性,$CI的来源则是system/core/CodeIgniter.php::get_instance获取到了当前Controller

	$this->_ci_models[] = $name;
$CI->$name = new $model();
return $this;

View

视图是的组件,但CI中并没有使用模板引擎,原因是让视图尽可能快的生成.这一层是由Controller输出的.那么Controller是如何与View进行交互的?

首先得建立视图文件,因为不需要编译,该视图只能是html与php代码的混合.然后Controller再调用.调用的过程就是$this->load->view('view')来完成,核心步骤则是\CI_Loader::_ci_load,其中一个难点在于,在不使用模板引擎却需要引用多个视图文件时,怎么办?这里在核心方法中就用ob_start()来解决,所以在视图中使用多个视图文件是可行的.

    $this->load->view('header');
$this->load->view('menu');
$this->load->view('content', $data);
$this->load->view('footer');

总结

其实在查看CI的源代码后,有两点感受,手册非常简明,我们所能做的事在手册上基本上都得到了;源代码并不没有大量使用面向对象,在熟悉了这种代码风格后,源代码确实不属于非常复杂.这是一款小巧的框架;

#CI的MVC实现的更多相关文章

  1. 【军哥谈CI框架】之入门教程之第二讲:分析CI结构和CI是怎么工作的

    [军哥谈CI框架]之入门教程之第二讲:分析CI结构和CI是怎么工作的   之入门教程之第二讲:分析CI结构和CI是如何工作的大家好!上一节,我们共同部署了一个CI网站,做到这一点非常简单,但是,亲们, ...

  2. CI(CodeIgniter)学习第二讲

    一.CI的文件结构: 了解CI的文件结构可以帮助我们快速的对CI框架有一个整体的认识,就好像我们去了一个陌生的城市一样,对你来讲周围的一切都是陌生和未知的,要想快速的了解这座城市,你可以买一张这座城市 ...

  3. CI(CodeIgniter)学习第一讲

    一.CI的优势一. (1).CI是一个PHP框架:大家都知道PHP框架有很多,CI只是其中之一,框架是为了重用发明的.同样,CI的目标是实现让你比从零开始编写代码更快速地开发项目.CI可以将需要完成的 ...

  4. **[权限控制] 利用CI钩子实现权限认证

    http://codeigniter.org.cn/forums/thread-10877-1-1.html 一直没找到CI的权限认证扩展,以前好像找到过一个老外的扩展,不过不怎么好用,现在记不清了, ...

  5. 第三方登录(QQ登录)开发流程详解

    原文:http://www.cnblogs.com/it-cen/p/4338202.html 近排由于工作的繁忙,已经一个星期没写博文做分享了,接下来我对网站接入第三方登录----QQ登录的实现逻辑 ...

  6. (转)第三方登录(QQ登录)开发流程详解

    近排由于工作的繁忙,已经一个星期没写博文做分享了,接下来我对网站接入第三方登录----QQ登录的实现逻辑做一个详细的讲解. 对于整个流程的详细文档可以到QQ互联官网(http://wiki.conne ...

  7. Codeigniter-实现权限认证

    两种方法 钩子函数 集成核心Controller 方法一,钩子函数: 一直没找到CI的权限认证扩展,以前好像找到过一个老外的扩展,不过不怎么好用,现在记不清了,后来仿着jsp firter的方式用CI ...

  8. 使用 CodeIgniter 框架快速开发 PHP 应用(五)

    原文:使用 CodeIgniter 框架快速开发 PHP 应用(五) 简化 HTML 页面和表格设计这一章介绍了又一个节约你的时间而且使你的代码更具安全性和逻辑性的领域.第一,我们将会介绍创建视图的各 ...

  9. 使用 CodeIgniter 框架快速开发 PHP 应用(三)

    原文:使用 CodeIgniter 框架快速开发 PHP 应用(三) 分析网站结构既然我们已经安装 CI ,我们开始了解它如何工作.读者已经知道 CI 实现了MVC式样. 通过对目录和文件的内容进行分 ...

随机推荐

  1. 一段简单c程序的汇编语言学习(ubuntu+x86)

    c程序代码: #include <stdio.h> int main(void) { int i=0, j=0; for(i=0; i<8; i++) j=j+1; return 0 ...

  2. jquery 字符个数(数字字母长度记为1,中文记为2,超过长度自动截)

    <script type="text/javascript">  //返回val的字节长度  function getByteLen(val) {  var len = ...

  3. 七牛云Fetch第三方资源并转码(PHP版)

    七牛云的图片加速一直在用,好用没得说,最近项目需要做个微信端录音,然后上传,别人试听的功能,录音和上传用的都是微信的接口,有文档,比较方便,但是上传后,微信只给保存3天,所以就下载到了七牛,也就用到了 ...

  4. python运维开发(八)----面向对象(下)

    内容目录: 面向对象三大特性之多态性 面向对象中的成员:字段.方法.属性 类的成员修饰符 类的特殊成员 特殊成员方法 面向对象其他 异常处理 设计模式之单例模式 面向对象的多态性 多态性:即指多种形态 ...

  5. 钱币兑换问题(hd1284)

    钱币兑换问题 在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法.请你编程序计算出共有多少种兑法.   Input 每行只有一个正整数N,N小于32768.   Output 对应每个输 ...

  6. UVA 1572 Self-Assembly

    拓扑排序,以边上标号为点,正方形为边,拓扑图中存在有向环时unbounded,否则bounded: 注意:仔细处理输入:   遍历一个点时,下一次遍历拼上的下一个方形边:即假设遍历到 A+ 时,下次从 ...

  7. If-Modified-Since和If-None-Match

    If-Modified-Since & If-None-MatchIf-Modified-Since,和 Last-Modified 一样都是用于记录页面最后修改时间的 HTTP 头信息,只是 ...

  8. Nginx 配置指令的执行顺序(七)

    来看一个 ngx_static 模块服务磁盘文件的例子.我们使用下面这个配置片段:     location / {        root /var/www/;    } 同时在本机的 /var/w ...

  9. 【配置】电信华为HG8245 无线路由器配置 有贴图

          引子:家里的电信无线路由器连接之后无法直接上上网,只能再次通过PPPoe方式拨号上网.经过网上查询和一番折腾之后,整理攻略如下. 1. 用超级用户登录192.168.1.1(默认密码) 用 ...

  10. CKEditor扩展插件:自动排版功能

    CKEditor是新一代的FCKeditor,是一个重新开发的版本.CKEditor是全球最优秀的网页在线文字编辑器之一,因其惊人的性能与可扩展性而广泛的被运用于各大网站. 如果还没接触过的可以看看, ...