当你使用定义一个控制器时,这个控制器的load成员已经是loader加载器类对象的一个引用,控制器加载视图时,也即你用了$this->load->view(‘ viewName ‘ , $data) 后,框架去调用loader装载器对象的view方法,
这个方法会把你的$data数组使用extract函数把数组元素提取出来,变成变量名和变量值的形式,这也就是为什么你传进去数组,却可以直接把数组元素的名字作为变量使用。那么视图是如何加载的呢,其实就是内部给你include了一下,就是直接把你的视图文件给包含了进来。
直接就总结,下面的想看的就可以看看如何得出结论的,
如果你感兴趣的话: 初学php框架,一时间难以理解框架复杂功能的实现机制,
但是却十分感兴趣,因为只有理解大致发生了什么才有继续学下去的兴趣,否则一直就想背函数似的,
根本掌握不了,今天给大家分享下我四处搜集、自己做实验得出的关于ci框架视图加载机制,即load->view的实现。刚开始想着随便找个博客就会得到答案,谁知找半天都找不到,
于是就参考着类加载机制以及亲手实验的方法,弄清楚了。 我当时一直都在费力的弄明白这个load->view(viewName,param)做了什么,而且为什么在视图中调用load->view()传的数组数据时,直接用数组元素的键值就可以了,
最开始还以为,框架又向视图发送了post请求,一直都这样理解,
后来仔细一想不对:php页面怎么会主动向视图发post请求,后来就越来越迷了,
打开搜索引擎搜索ci框架视图实现机制,始终都找不到合适的理解,出现最多的是关于load_class这个函数的定义的理解 以及一些十分浅显的load->view()的用法,
也不说咋实现的,于是我自己就想着亲自找出来这个load_view(),找的过程收获不小,对于我这种初学者来说。
下面说一下我找的过程以及对视图加载的理解。
Note: 这篇教程假设你已经下载好 CodeIgniter ,并将其 安装 到你的开发环境。 你要做的第一件事情是新建一个 控制器 来处理静态页面,控制器就是一个简单的类, 用来完成你的工作,
它是你整个 Web 应用程序的 “粘合剂” 。
例如,当访问下面这个 URL 时: http://maisui1.com/t/抖音同款/ 通过这个 URL 我们就可以推测出来,有一个叫做 "t" 的控制器,被调用的方法为 "t/**/" , 这个方法的作用应该是查询 10 条新闻条目并显示在页面上。在 MVC 模式里,你会经常看到下面 格式的 URL : http://maisui1.com/[controller-class]/[controller-method]/[arguments] 在正式环境下 URL 的格式可能会更复杂,但是现在,我们只需要关心这些就够了。 新建一个文件 application/controllers/Pages.php ,然后添加如下代码。
<?php class Pages extends CI_Controller { public function view($page = ‘home‘) { } }
public function view($page = ‘home‘) { if ( ! file_exists(APPPATH.‘views/pages/‘.$page.‘.php‘)) { // Whoops, we don‘t have a page for that! show_404(); } $data[‘title‘] = ucfirst($page); // Capitalize the first letter $this->load->view(‘templates/header‘, $data); $this->load->view(‘pages/‘.$page, $data); $this->load->view(‘templates/footer‘, $data); }
你刚刚新建了一个控制器,里面有一个 view() 方法,这个方法接受一个参数 用于指定要加载的页面,静态页面模板位于 application/views/pages/ 目录。
在该目录中,再新建两个文件 home.php 和 about.php ,在每个文件里随便 写点东西然后保存它们。如果你没什么好写的,就写 "Hello World!" 吧。
为了加载这些页面,你需要先检查下请求的页面是否存在:
当请求的页面存在,将包括页面和页脚一起被加载并显示给用户,如果不存在, 会显示一个 "404 Page not found" 错误。
第一行检查页面是否存在,file_exists() 是个原生的 PHP 函数,用于检查某个 文件是否存在,show_404() 是个 CodeIgniter 内置的函数,用来显示一个默认的 错误页面。
在页头文件中,$title 变量用来自定义页面的标题,它是在这个方法中赋值的, 但是注意的是并不是直接赋值给 title 变量,而是赋值给一个 $data 数组的 title 元素。
最后要做的是按顺序加载所需的视图,view() 方法的第二个参数用于向视图传递参数, $data 数组中的每一项将被赋值给一个变量,这个变量的名字就是数组的键值。 所以控制器中 $data[‘title‘] 的值,就等于视图中的 $title 的值。
控制器现在开始工作了!在你的浏览器中输入 [your-site-url]index.php/pages/view 来查看你的页面。当你访问 index.php/pages/view/about 时你将看到 about 页面, 包括页头和页脚。
使用自定义的路由规则,你可以将任意的 URI 映射到任意的控制器和方法上,从而打破 默认的规则:
http://example.com/[controller-class]/[controller-method]/[arguments]
让我们来试试。打开文件 application/config/routes.php 然后添加如下两行代码, 并删除掉其他对 $route 数组赋值的代码。
<?php class News extends CI_Controller { public function __construct() { parent::__construct(); $this->load->model(‘news_model‘); $this->load->helper(‘url_helper‘); } public function index() { $data[‘news‘] = $this->news_model->get_news();
} public function view($slug = NULL) { $data[‘news_item‘] = $this->news_model->get_news($slug); } }
CodeIgniter 从上到下读取路由规则并将请求映射到第一个匹配的规则,每一个规则都是 一个正则表达式(左侧)映射到 一个控制器和方法(右侧)。当有请求到来时,CodeIgniter 首先查找能匹配的第一条规则,然后调用相应的控制器和方法,可能还带有参数。
这里,第二条规则中 $routes 数组使用了通配符 (:any) 可以匹配所有的请求, 然后将参数传递给 Pages 类的 view() 方法。
现在访问 index.php/about 。路由规则是不是正确的将你带到了控制器中的 view() 方法?实在是太棒了!
http://maisui1.com/t/抖音同款网红美食/
http://maisui1.com/p/抖音同款网红美食/
http://maisui1.com/j/抖音同款网红美食/
http://maisui1.com/t/抖音同款/
http://maisui1.com/p/抖音同款/
http://maisui1.com/j/抖音同款/
阅读上面的代码你会发现,这和之前写的代码有些相似之处。首先是 __construct() 方法,它调用父类(CI_Controller)中的构造函数,
并加载模型。这样模型就可以 在这个控制器的其他方法中使用了。另外它还加载了 URL 辅助函数 , 因为我们在后面的视图中会用到它。
其次,有两个方法用来显示新闻条目,一个显示所有的,另一个显示特定的。 你可以看到第二个方法中调用模型方法时传入了 $slug 参数,
模型根据这个 slug 返回特定的新闻条目。 现在,通过模型,控制器已经获取到数据了,但还没有显示。下一步要做的就是, 将数据传递给视图。
原文:https://www.cnblogs.com/maisui1234/p/10363865.html