#CI的MVC实现

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

posted on 2016-04-04 19:33  给个理由先  阅读(201)  评论(0编辑  收藏  举报

导航