博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一步一步重写 CodeIgniter 框架 (6) —— 实现在控制器Controller中加载Vi
阅读量:6804 次
发布时间:2019-06-26

本文共 2666 字,大约阅读时间需要 8 分钟。

  hot3.png

 

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

复制代码

My First View 

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

复制代码

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

复制代码

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

复制代码

4. 测试

访问  ,可以看到如下输出

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

转载于:https://my.oschina.net/yomut/blog/712604

你可能感兴趣的文章
RCP 文件路径问题
查看>>
View 4.6连接异常 求助~~~~~!
查看>>
python网络编程socketserver模块(实现TCP客户端/服务器)
查看>>
[python] 线程简介
查看>>
pure响应式布局
查看>>
homework-09
查看>>
jquery文档处理如after错误
查看>>
P3564 [POI2014]BAR-Salad Bar
查看>>
js字符串与正则匹配
查看>>
2 变量、运算符、位运算
查看>>
电路的耦合方式
查看>>
JS 创建对象的7种方法(一)
查看>>
decode
查看>>
Python Socket套接字
查看>>
source from Other`s
查看>>
算法笔记--归并排序
查看>>
iOS --开发笔记:关于手机号码的判断【转】
查看>>
多标签分类
查看>>
Python基础教程(第2版 修订版) pdf
查看>>
python实现常见排序算法
查看>>