11.thinkphp的模板
一.引擎驱动
1. MVC中,M(模型)和C(控制器)是前面我们所了解的内容,而V(视图)就是页面;
2. TP6.0默认不自带TT模版引擎,它作为一个可选的扩展给开发人员安装;
3. 也就是说,并不一定非要使用模板引擎的语法规则来开发V(视图)部分;
4. 如果不用模版引擎,可以在控制器通过require()方法引入PHP文件混编即可;
那么有很多数据,怎么和前端通信呢?
解决:
============================================
也可以通过依赖注入:
5. 如果要使用模版引擎,先创建一个用于测试模板引擎的控制器:Show.php;
6. 写入模版引擎的调用语法,来判断,是否已经安装了模板引擎扩展;
return View::fetch('index'); //出现缺少驱动的错误
7. 然后,安装如下驱动后,再刷新页面即可;
composer require topthink/think-view
二.赋值变量
1. 在控制器区域,通过assign()设置一个向模版提供变量的赋值操作;
View::assign('name', 'Mr.Lee');
2. 而模版区域,只需要通过{$name}的语法即可获取到控制器设置的值; {$name}
3. assign()方法,支持通过数组的方式,传递模版变量;
View::assign(['name' => 'Mr.Lee','age' => 100]);
4. 也可以直接通过fetch()方法的第二参数,直接用数组传递模版变量;
return View::fetch('index', ['name' => 'Mr.Lee','age' => 100]);
5. 助手函数view(),和View::fetch()一样;
return view('index', [...]);
6. 可以使用filter()方法,对所有模版的变量进行过滤操作;
return View::filter(function ($content) {return strtoupper($content);})->fetch('index');return view('index')->filter(function ($content) {return strtoupper($content);});
这个content指的是把所有变量传递过去,也就是
View::assign([
'name' => 'Mr.Lee',
'age' => 100
]);
======================================================================
模板赋值
模板中的变量(除了一些系统变量外)必须先进行模板赋值后才能使用,可以使用assign
方法进行全局模板变量赋值。
namespace app\controller;use think\facade\View;class Index
{public function index(){// 模板变量赋值View::assign('name','ThinkPHP');View::assign('email','thinkphp@qq.com');// 或者批量赋值View::assign(['name' => 'ThinkPHP','email' => 'thinkphp@qq.com']);// 模板输出return View::fetch('index');}
}
assign
方法赋值属于全局变量赋值,如果你需要单次赋值的话,可以直接在fetch
方法中传入。
namespace app\controller;use think\facade\View;class Index
{public function index(){// 模板输出并变量赋值return View::fetch('index', ['name' => 'ThinkPHP','email' => 'thinkphp@qq.com']);}
}
助手函数
如果使用view
助手函数渲染输出的话,可以使用下面的方法进行模板变量赋值:
return view('index', ['name' => 'ThinkPHP','email' => 'thinkphp@qq.com'
]);
助手函数的变量赋值也是当次模板渲染有效
一.模版配置
1. 默认情况下,config/view.php就是默认模版引擎的配置文件;
2. 内部的配置注释写的非常清楚了,一般情况下,不需要任何改动;
二.模版渲染
1. 除了在配置文件修改外,还可以在控制器端动态修改模版配置;
View::config(['view_dir_name' => 'view2']);
config里面的放置view_dir_name,更改view2目录
那这样子就是动态修改
2. 默认情况下,调用的是本控制器的模版文件,也可以调用其它控制器的模版文件;
return View::fetch('Address/index');
使用fetch指定控制器的话:
就会跳到指定的控制器目录
3. 如果你是多模块(多应用)模式下,也可以实现跨模块调用模版文件;
return View::fetch('admin@User/index');
4. 如果直接在view 根目录下的模版文件,用一个斜杠来设定即可调用;
return View::fetch('/index');
5. 如果想调用public公共目录的模版文件,用../public后面跟着URL即可;
return View::fetch('../public/test/test);
6. 这种做法的调用方式,和模版引擎调用一样,只不过通信的数据获取方式有差异;
return View::engine('php')->fetch('index');
7. 第二种原生PHP执行方式,在return之前设置的变量或者模版变量均无效;
8. 而是把所有的要传递的变量,通过fetch()的第二个参数传递;
return View::engine('php')->fetch('index', ['name' => 'Mr.Lee','age' => 100]);
使用原生的php,只能把变量放置在fetch第二个参数之内,才能传递。
如果是使用原生,那么就得改成php后缀,index.html=index.php
一.变量输出
1. 当程序运行的时候,会在runtime/temp目录下生成一个编译文件;
2. 默认情况下,输出的模版变量会自动进行过滤,过滤函数默认如下:
<?php echo htmlentities($name); ?>
3. 如果传递的值是数组,在模版区域可以使用$data.name这种形式输出;
$arr = ['name'=>'Mr.Lee', 'age'=>100];return View::fetch('output', ['arr' => $arr]);{$arr.name}--{$arr.age}//模版数组变量输出
<?php echo htmlentities($arr['name']); ?>//编译文件
编译文件和php的原生代码是一致的。
4. 如果传递的值是对象,那么编译文件也会自动相应的对应输出方式;
public $name = 'Mr.Lee';public $age = 'age';const PI = 3.14;return View::fetch('output', ['obj' => $this,]);{$obj->name}--{$obj->age}--{$obj->fn()}--{$obj::PI}<?php echo htmlentities($obj->name); ?>//编译文件
注意:静态调用方法得有start。也就是两个冒号::得用静态或者常量
二.其它输出
1. 如果输出的变量没有值,可以直接设置默认值代替;
{$data.name|default='没有姓名'}
2. 系统变量有:$_SERVER、$_ENV、$_GET、$_POST、$_REQUEST、$_SESSION和$_COOKIE;
3. 对于注入Request对象,也可以直接在模版输出;
{$Request.get.id}{$Request.param.name}{$Request.host}
4. 常量、配置信息等都可以通过$Think输出;
{$Think.const.PHP_VERSION}{$Think.PHP_VERSION}{$Think.config.app.app_host}{$Think.config.session.name}