codeigniter 如何加载view里的文件

当你使用定义一个控制器时,这个控制器的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.phpabout.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 返回特定的新闻条目。 现在,通过模型,控制器已经获取到数据了,但还没有显示。下一步要做的就是, 将数据传递给视图。

猜你喜欢

转载自www.cnblogs.com/maisui1234/p/10363865.html
今日推荐