文档章节

一步一步重写 CodeIgniter 框架 (6) —— 实现在控制器Controller中加载Vi

Yomut
 Yomut
发布于 2016/07/15 17:15
字数 677
阅读 7
收藏 0

 

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!

本文转载自:http://www.cnblogs.com/zhenyu-whu/p/3183111.html

Yomut
粉丝 19
博文 191
码字总数 167789
作品 0
厦门
后端工程师
私信 提问
使用 CodeIgniter 创建 Facebook 应用程序

本文向您演示了如何让 Facebook 示例应用程序与 PHP 框架 - CodeIgniter 共同工作。虽然有许多有关 Facebook 开发的好文章,当然,也有一些有关使用 CodeIgniter 来构建应用程序的好文章,但...

IBMdW
2011/07/12
1K
0
CodeIgniter 框架分析

入口文件 入口文件主要完成下列工作: 1) 指定 CodeIgniter 框架所在目录; 2) 定义 APPPATH 常量,指示应用程序文件根目录; 3) 载入 codeigniter/CodeIgniter.php 文件,启动框架。 codeig...

那些年我们一起
2012/08/10
0
17
CodeIgniter框架环境配置

之前连续搭了好几个项目,觉得用CodeIgniter框架搭建项目已经非常熟悉了。今天想再单独弄一个环境,用作PHP技术的学习和实践平台,却发现之前“熟记”的过程都快放的差不多了,怎么都安装不成...

Claire_level
2012/05/14
0
0
CodeIgniter + uploadify 在 IE 下会话丢失问题的解决方案

最近需要学习并用CodeIgniter框架对一个项目进行二次开发,由于之前一直都是使用Symfony做项目,所以再换到CodeIgniter项目上还是比较顺畅的。不过相比较之下,感觉CodeIgniter比Symfony要轻...

random123
2014/06/23
0
0
CodeIgniter 4 宣布开发路线图

我们综合考虑了社区的愿望和意见后,也对什么样的未来对 CI 是最合适的做了一些思考,然后,CI 理事会对框架的未来做出了一些决策。预告一下,未来将会有重大变化,但我们相信他们不仅为我们...

CodeIgniter中国
2016/03/24
7.8K
32

没有更多内容

加载失败,请刷新页面

加载更多

利用mybatis generator生成实体类、Mapper接口以及对应的XML文件

项目中通常会遇到数据的持久化,如果是采用mybatis的orm,就会涉及到生成xml的问题,刚好mybatis官网提供了这么个插件MyBatis Generator,效果简直是棒呆。 1. 首先需要在build.gradle文件中...

啊哈关关
今天
2
0
SpringSocial相关的知识点

使用SprigSocial开发第三方登录 核心类 ServiceProvider(AbstractOauth2ServiceProvider):主要负责实现server提供商(例如QQ,微信等共有的东西),默认实现类是AbstractOauth2ServiceProvider...

chendom
今天
1
0
Java并发之AQS详解

一、概述   谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)!   类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源...

群星纪元
昨天
2
0
Fabric-sdk-java最新教程

Fabric Java SDK是Fabric区块链官方提供的用于Java应用开发的SDK,全称为Fabric-sdk-java,网上可用资料不多,本文列出了精心整理的针对Fabric Java SDK的最新精选教程。 如果希望快速掌握F...

汇智网教程
昨天
2
0
react 子组件监听props 变化

componentWillReceiveProps //已经被废弃 getDerivedStateFromProps// 推荐使用//如果条件不存在必须要返回null static getDerivedStateFromProps(props, current_stat...

一箭落旄头
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部