一步一步重写 CodeIgniter 框架 (6) —— 实现在控制器Controller中加载View
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的更多相关文章
- 一步一步重写 CodeIgniter 框架 (5) —— 实现Controller,并加载Model
CodeIgniter 框架采用MVC模式,而MVC模式中起纽带作用的就是C(控制器),在控制器的中通过加载模型获得数据,将数据传到视图中进行展示.本课将实现在控制器中加载模型. 1. 控制器的实现 ...
- Android 框架修炼-自己开发高效异步图片加载框架
一.概述 目前为止,第三方的图片加载框架挺多的,比如UIL , Volley Imageloader等等.但是最好能知道实现原理,所以下面就来看看设计并开发一个加载网络.本地的图片框架. 总所周知,图 ...
- Google官方网络框架-Volley的使用解析Json以及加载网络图片方法
Google官方网络框架-Volley的使用解析Json以及加载网络图片方法 Volley是什么? Google I/O 大会上,Google 推出 Volley的一个网络框架 Volley适合什么场 ...
- 一步一步重写 CodeIgniter 框架 (9) —— 使用 CodeIgniter 类库
通过前面几节的内容,我们从零开始搭建了一个非常方便的MVC框架,理解了 CodeIgniter 框架最核心的部分.然而一个框架的便利不仅仅在于提供一个MVC就可以了,它还必须具有较高的扩展性.下面将从 ...
- 一步一步重写 CodeIgniter 框架 (12) —— 代码再重构,回归 CI
第一课中搭建的基本的 框架模型, 只有一个 index.php 作为执行文件,按这种方式最不稳定的因素就是路径的问题. 我们经常需要通过合适的参数,比如 load_class('output') 或 ...
- 一步一步重写 CodeIgniter 框架 (4) —— load_class 管理多个对象实例的思路
我们使用CodeIgniter 框架最主要是想利用其 MVC 特性,将模型.视图分开,并通过控制器进行统一控制.在尝试实现 MVC 模式之前,我们将实现其中一个对程序结构非常有用的技巧,就是 load ...
- 一步一步重写 CodeIgniter 框架 (3) —— 用面向对象重构代码
前面两篇文章为了重点突出 CodeIgniter 框架的原理,程序的结构很乱,有很多全局变量,在这一课中我们采用面向对象的方法对原先代码进行重构. 到目前为止,程序主要完成的就是 URL 分析,并根据 ...
- 一步一步重写 CodeIgniter 框架 (1) —— url 如何映射到具体的方法
CodeIgniter 框架最显著的特征就是 MVC 模式,它的做法就是提取 url 中的'分段', 映射到某个类的某个方法,从而由该方法来输出最终显示的页面内容.那么我们第一课中就是实现一个这样的原 ...
- 一步一步重写 CodeIgniter 框架 (11) —— 使用 CodeIgniter 函数库
在完成了CI框架的类库扩展后,很自然我们就会想到函数库的扩展.函数库的扩展在 CI 中称为 helper 函数与类有不同的地方,它不能继承,只能覆盖或者添加新的函数,或者直接完全新定义的一组函数. 由 ...
随机推荐
- (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单
原文 (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单 接上一节:(C#)Windows Shell 编程系列2 - 解释,从“桌面”开始展开这 ...
- LeapMotion 简介
Leap Motion Overview Leap Motion是一种检测和跟踪hands, fingers and finger-like tools的设备.该设备在一个较近的环境中操作,精度高,跟 ...
- CSF 中的应用程序请求路由
编辑人员注释:本文章由 AzureCAT 团队的 Christain Maritnez 撰写. 应用程序请求路由(简称为 ARR)可能是 Microsoft 使用的技术中讨论得最少但极为重要的技术之一 ...
- Thrift对多接口服务的支持
Thrift对多接口服务的支持 Thrift在0.9.1版本之前,一直只提交了对单一接口服务的支持,即一个RPC服务器(对应一个端口)支持一个服务接口的实现. 但是很多时候,我们的服务不能实现在一个接 ...
- VS2008编译iconv静态链接库
iconv是将一种编码格式转换为还有一种编码格式的开源库,比如能够把Windows环境下通用的ASCii(中文是GB2312)编码转换为国际通用的Unicode编码 iconv最新版本号仅仅支持Min ...
- C# MyNewQueue 消息队列
C# using System; using System.Messaging; using System.Drawing; using System.IO; namespace MyProject ...
- Sharepoint 2013 启用搜做服务
参考文件: http://www.cnblogs.com/jianyus/archive/2013/02/04/2891801.html 1. 创建好网站集,进入网站内容,点击搜素,会出现如下错误:( ...
- SQL Server验证的两种方式
1.Windows身份验证:本机连接或者受信的局域网连接(一般在忘记管理员密码或者做系统配置的情况下使用). 2.SQLServer验证:使用用户名.密码验证(推荐使用). 启用方法:以Windows ...
- 使用PowerShell 命令集进行SQL Server 2012 备份和还原
最近心相不错,所以打算翻译一些英文文档做福利,原文在此,翻译有不足的地方还请各位兄弟指点. 讨论什么是DBA最重要的工作的时候,你最常听到就是一条就是DBA只要做好备份和恢复.事实如此,如果你不做备份 ...
- 【ActiveMQ】设置自动重连
<property name="brokerURL" value="tcp://localhost:61616"/> <property na ...