前言
在线课程中,我会出一系列的“详解”课程,针对TP5框架中各个知识点,进行详细解说。课程主要分成两个部分,语法解读(非常入门)和核心实现(涉及TP框架核心源代码的阅读,非常复杂)
相关课程会发布在 “ThinkPHP 5 框架(入门篇)”,也就是 “就业版课程 https://www.sodevel.com/course/3”
下面,以文字的形式给大家分享一下模板赋值的基本知识。
基本概念
模板赋值,就是将变量从 控制器 传递到 视图的方法。
基本语法
TP5 提供了多种方法,实现赋值功能。
assign()
必须在控制器中,且继承了\think\Controller 的情况下使用。$this->assign('a',1);
$this->assign(['a'=>1, 'b'=>2]);
以上两种语法均可。
$this->fetch()
必须在控制器中,且继承了\think\Controller 的情况下使用。$模板变量数组 = ['a'=>1];
$this->fetch('模板文件名',$模板变量数组);
助手函数 view()
和 $this->fetch() 几乎一样,只是改成了 view('模板文件名', $模板变量数组);
share()
可以在任何地方使用。\think\View::share($模板变量数组);
后记
以上几种方法,都是为了模板变量传递,只要能实现,用哪种方法都是没区别的。
我习惯用 助手函数,特殊情况下会用 assign,无奈的情况下会使用 share(),在我后续的课程中有用到多种方法(暂时没有share),实践出真知吧。
这些在TP5手册上都有,我就不细说了。
模板赋值的实现
以下涉及到 thinkphp5 的核心源代码阅读,看不懂不要慌,因为很多新同学都看不懂。
以 view() 助手函数为例
在 \thinkphp\helper.php 中定义了 view 函数。
代码主要功能:Response::create($template, 'view', $code)->replace($replace)->assign($vars);
实际结果,调用 think\response\View 对象的 assign() 方法。
think\response\View::assign()
该方法非常简单,将模板变量写入 类属性 $this->vars
谁使用了 $this->vars 这个类属性?
在 think\response\View::output() 方法中,使用了这个类属性。ViewTemplate::instance(Config::get('template'), Config::get('view_replace_str'))
->fetch($data,$this->vars,$this->replace);
以上代码其实是调用了 think\View 类的 fetch() 方法。
注意:思考一个问题,谁调用了 View::output(),文末会讲。
think\View::fetch()
做的事情比较多,和模板赋值有关的如下。$this->engine->$method($template, $vars, $config);
实际是,调用了 think\view\driver\Think 类的 fetch 方法
think\view\driver\Think::fetch()
和模板赋值有关的代码如下。
this−>template−>fetch(this−>template−>fetch(template, data,data,config);
实际调用的是 think\Template::fetch() 方法。
think\Template::fetch()
与模板赋值有关的代码如下。$this->storage->read($cacheFile,$this->data);
实际是调用了 \think\template\driver\File::read() 方法。
\think\template\driver\File::read()
主要做了两件事。//将模板变量数组打碎,变为独立变量。
extract($vars, EXTR_OVERWRITE);
然后,//执行模板文件
include$cacheFile;
至此,模板已经执行完毕,模板变量自然也用完了。
再看,think\Template::fetch()
模板执行完毕之后,获取执行结果,并 echo 到网页上。$content= ob_get_clean();
echo$content;
至此
模板变量的赋值结束,并且在网页上显示了编译后的模板内容。
谁调用了 View::output()
这个,我们要从头看起
public/index.php
程序的唯一入口,你访问任何网址,都是从这里开始的。//包含了 start.php
include('...start.php')
\thinkphp\start.php// 执行应用
App::run()->send();
这段代码实际等于 \think\response\View::send() 方法
\think\response\View::send()
该方法,来自 View 的父类,也就是 \think\Response 类。
\think\Response::send()
里边调用了 $this->getContent(),这是关键点。
\think\Response::getContent()
里边的这段代码,调用了 内部的 output()方法,又因为 \think\response\View 子类的同名方法覆盖原则,执行的是:\think\response\View::output() 方法。$content=$this->output($this->data);
至此
你应该知道模板赋值的整个过程了。
后记
以上内容,在视频课程中均有讲解(用了大约30分钟),理论上更为 唠叨 和 细致 。因为讲的是模板赋值的过程,很多无关代码都过滤掉了,大家有兴趣可以慢慢深入。
特别注意
以上代码,说起来轻松,读起来难。
新人经常会被跳晕,很多代码细节不理解,这都是正常的。如果可能,你可以用1个月甚至更久的时间,深入研究TP5的源代码,你的进步将是大跃进级别的!
PS:如果是初学者(刚刚看了TP5的基础课),就不要尝试了,可能会很悲伤。