1. 控制器将模型类获得的数据,传递给视图进行显示,所以视图必须负责接收数据,另外重要的一点是当模型和视图分开后,多个模型的数据可以传递给一个视图进行展示,也可以说一个模型的数据在多个不同的视图中进行展示。所以CodeIgniter 框架视图的接口有两个重要参数,

public function view($view, $vars = array(), $return = FALSE)

$view 即使加载哪一个视图,$vars 即是传入的数据, $return 即表示是直接输出还是返回(返回可以用于调试输出)

2. 为了达到很好的讲述效果,我们直接参看 CodeIgniter类中的 代码

function view($view, $vars = array(), $return = FALSE) {
  return $this->_ci_load(array('_ci_view' => $view, '_ci_vars' => $this->_ci_objects_to_array($vars), '_ci_return' => $return));
}

它用到两个辅助函数,先看简单的

/**
* Object to Array
*
* Takes an object as input and converts the class variables to array key/vals
*
* @param object
* @return array
*/
protected function _ci_object_to_array($object)
{
  return (is_object($object)) ? get_object_vars($object) : $object;
}

如果 $object 是对象的话,则通过 get_object_vars 函数返回关联数组, 这个可以作为平时的小积累。

再看 _ci_load 函数

public function _ci_load($_ci_data) {

        // 通过 foreach 循环建立四个局部变量,且根据传入的数组进行赋值(如果没有,则为FALSE)
foreach (array('_ci_view', '_ci_vars', '_ci_path', '_ci_return') as $_ci_val) {
$$_ci_val = ( ! isset($_ci_data[$_ci_val])) ? FALSE : $_ci_data[$_ci_val];
} $file_exists = FALSE; // 设置路径, 单纯加载视图的时候 ,_ci_path 为空,会直接执行下面的 else 语句
if ($_ci_path != '') {
$_ci_x = explode('/', $_ci_path);
$_ci_file = end($_ci_x);
} else { // 判断 扩展名,如果没有则加上.php 后缀
$_ci_ext = pathinfo($_ci_view, PATHINFO_EXTENSION);
$_ci_file = ($_ci_ext == '') ? $_ci_view.'.php' : $_ci_view; // 搜索存放 view 文件的路径
foreach ($this->_ci_view_paths as $view_file => $cascade) {
if (file_exists($view_file.$_ci_file)) {
$_ci_path = $view_file.$_ci_file;
$file_exists = TRUE;
break;
} if ( ! $cascade) {
break;
}
}
} if ( ! $file_exists && ! file_exists($_ci_path)) {
exit('Unable to load the requested file: '.$_ci_file);
} include($_ci_path);
}

这里我们针对最简单的加载 view 的需求,抽取了完成基本 view 的代码,从以上代码可以看到,加载 view 其实很简单,include 即可。

include 之前只是简单对传入的 视图名作扩展名处理,以达到加载默认 .php 后缀的视图时不需要包含.php ,而像 $this->load->view('test_view');

3. 我们将使用 CodeIgniter 中视图的例子

在views 下面新建一个文件
test_view.php

<html>
<head>
<title>My First View</title>
</head>
<body>
<h1>Welcome, we finally met by MVC, my name is Zhangzhenyu!</h1>
</body>
</html>

并在 controllers/welcome.php 中加载视图

function saysomething($str) {
$this->load->model('test_model'); $info = $this->test_model->get_test_data(); $this->load->view('test_view');
}

4. 测试

访问 http://localhost/learn-ci/index.php/welcome/hello ,可以看到如下输出

Welcome, we finally met by MVC, my name is Zhangzhenyu!

一步一步重写 CodeIgniter 框架 (6) —— 实现在控制器Controller中加载View的更多相关文章

  1. 一步一步重写 CodeIgniter 框架 (5) —— 实现Controller,并加载Model

    CodeIgniter 框架采用MVC模式,而MVC模式中起纽带作用的就是C(控制器),在控制器的中通过加载模型获得数据,将数据传到视图中进行展示.本课将实现在控制器中加载模型. 1. 控制器的实现 ...

  2. Android 框架修炼-自己开发高效异步图片加载框架

    一.概述 目前为止,第三方的图片加载框架挺多的,比如UIL , Volley Imageloader等等.但是最好能知道实现原理,所以下面就来看看设计并开发一个加载网络.本地的图片框架. 总所周知,图 ...

  3. Google官方网络框架-Volley的使用解析Json以及加载网络图片方法

    Google官方网络框架-Volley的使用解析Json以及加载网络图片方法 Volley是什么? Google I/O 大会上,Google 推出 Volley的一个网络框架 Volley适合什么场 ...

  4. 一步一步重写 CodeIgniter 框架 (9) —— 使用 CodeIgniter 类库

    通过前面几节的内容,我们从零开始搭建了一个非常方便的MVC框架,理解了 CodeIgniter 框架最核心的部分.然而一个框架的便利不仅仅在于提供一个MVC就可以了,它还必须具有较高的扩展性.下面将从 ...

  5. 一步一步重写 CodeIgniter 框架 (12) —— 代码再重构,回归 CI

    第一课中搭建的基本的 框架模型, 只有一个 index.php 作为执行文件,按这种方式最不稳定的因素就是路径的问题. 我们经常需要通过合适的参数,比如 load_class('output') 或 ...

  6. 一步一步重写 CodeIgniter 框架 (4) —— load_class 管理多个对象实例的思路

    我们使用CodeIgniter 框架最主要是想利用其 MVC 特性,将模型.视图分开,并通过控制器进行统一控制.在尝试实现 MVC 模式之前,我们将实现其中一个对程序结构非常有用的技巧,就是 load ...

  7. 一步一步重写 CodeIgniter 框架 (3) —— 用面向对象重构代码

    前面两篇文章为了重点突出 CodeIgniter 框架的原理,程序的结构很乱,有很多全局变量,在这一课中我们采用面向对象的方法对原先代码进行重构. 到目前为止,程序主要完成的就是 URL 分析,并根据 ...

  8. 一步一步重写 CodeIgniter 框架 (1) —— url 如何映射到具体的方法

    CodeIgniter 框架最显著的特征就是 MVC 模式,它的做法就是提取 url 中的'分段', 映射到某个类的某个方法,从而由该方法来输出最终显示的页面内容.那么我们第一课中就是实现一个这样的原 ...

  9. 一步一步重写 CodeIgniter 框架 (11) —— 使用 CodeIgniter 函数库

    在完成了CI框架的类库扩展后,很自然我们就会想到函数库的扩展.函数库的扩展在 CI 中称为 helper 函数与类有不同的地方,它不能继承,只能覆盖或者添加新的函数,或者直接完全新定义的一组函数. 由 ...

随机推荐

  1. (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单

    原文 (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单 接上一节:(C#)Windows Shell 编程系列2 - 解释,从“桌面”开始展开这 ...

  2. LeapMotion 简介

    Leap Motion Overview Leap Motion是一种检测和跟踪hands, fingers and finger-like tools的设备.该设备在一个较近的环境中操作,精度高,跟 ...

  3. CSF 中的应用程序请求路由

    编辑人员注释:本文章由 AzureCAT 团队的 Christain Maritnez 撰写. 应用程序请求路由(简称为 ARR)可能是 Microsoft 使用的技术中讨论得最少但极为重要的技术之一 ...

  4. Thrift对多接口服务的支持

    Thrift对多接口服务的支持 Thrift在0.9.1版本之前,一直只提交了对单一接口服务的支持,即一个RPC服务器(对应一个端口)支持一个服务接口的实现. 但是很多时候,我们的服务不能实现在一个接 ...

  5. VS2008编译iconv静态链接库

    iconv是将一种编码格式转换为还有一种编码格式的开源库,比如能够把Windows环境下通用的ASCii(中文是GB2312)编码转换为国际通用的Unicode编码 iconv最新版本号仅仅支持Min ...

  6. C# MyNewQueue 消息队列

    C# using System; using System.Messaging; using System.Drawing; using System.IO; namespace MyProject ...

  7. Sharepoint 2013 启用搜做服务

    参考文件: http://www.cnblogs.com/jianyus/archive/2013/02/04/2891801.html 1. 创建好网站集,进入网站内容,点击搜素,会出现如下错误:( ...

  8. SQL Server验证的两种方式

    1.Windows身份验证:本机连接或者受信的局域网连接(一般在忘记管理员密码或者做系统配置的情况下使用). 2.SQLServer验证:使用用户名.密码验证(推荐使用). 启用方法:以Windows ...

  9. 使用PowerShell 命令集进行SQL Server 2012 备份和还原

    最近心相不错,所以打算翻译一些英文文档做福利,原文在此,翻译有不足的地方还请各位兄弟指点. 讨论什么是DBA最重要的工作的时候,你最常听到就是一条就是DBA只要做好备份和恢复.事实如此,如果你不做备份 ...

  10. 【ActiveMQ】设置自动重连

    <property name="brokerURL" value="tcp://localhost:61616"/> <property na ...