视图功能由Think\View类和模板引擎(驱动)类一起完成。
// 实例化视图类
$view = new \think\View();
// 渲染模板输出
return $view->fetch();
如果你的控制器继承了\think\Controller类的话,则可以直接使用
// 渲染模板输出
return $this->fetch();
需要注意的是,ThinkPHP5的视图fetch方法不会直接渲染输出,只是返回解析后的内容。如果在控制器类返回 视图解析内容的话,渲染输出系统会自动调用think\Response类的send方法进行渲染输出。
模板文件目录默认位于模块的view目录下面,视图类的fetch方法中的模板文件的定位规则如下:
如果调用没有任何参数的fetch方法:
return $view->fetch();
则按照系统的默认规则定位模板文件到:
>[info] ### [模板文件目录]/当前控制器名(小写)/当前操作名(小写).html
如果(指定操作)调用:
return $view->fetch('add');
则定位模板文件为:
>[info] ### [模板文件目录]/当前控制器名/add.html
如果调用控制器的某个模板文件使用:
return $view->fetch('user/add');
则定位模板文件为:
[模板文件目录]/user/add.html
全路径模板调用:
return $view->fetch(MODULE_PATH.'view/public/header.html');
则定位模板文件为:
MODULE_PATH.'view/public/header.html'
默认并不支持模板主题功能,需要配置开启,例如:
$view = new \think\View();
return $view->theme('blue')->fetch('User/add');
表示使用blue模板主题风格输出,定位模板文件为:
[模板文件目录]/blue/User/add.html
或者也可以使用下面的方式支持模板主题:
$view = new \think\View();
return $view->fetch('blue/User/add');
和上面使用模板主题功能输出的模板文件是相同的。
如果要进行自动侦测模板主题的话,按照如下方式使用:
$view = new \think\View();
return $view->theme(true)->fetch('User/add');
theme(true) 表示开启模板主题自动侦测功能,通常是在URL地址中传入模板主题参数,默认情况下,只需要使用:
http://serverName/moduleName/controllerName/actionName/t/blue
之后,模板主题名称将会被保存到Cookie中,直到重新指定新的模板主题名称。
可以在视图实例化的时候设置参数或者在模板输出之前动态设置参数,例如下面两种方式等效:
// 实例化视图类的时候设置参数
$view = new \think\View(['view_suffix'=>'.html','view_depr'=>'/']);
// 或者使用http方法动态设置视图输出参数
$view->config(['view_suffix'=>'.html','view_depr'=>'_']);
支持独立设置某个参数,例如:
$view->config('view_suffix','.html');
支持对视图输出的内容进行字符替换,例如:
$view->config('parse_str',['__PUBLIC__'=>'/public/'])->fetch();
如果需要全局替换的话,可以直接在配置文件中添加:
'parse_str'=>[
'__PUBLIC__'=>'/public/',
'__ROOT__' => '/',
]
在渲染模板或者内容输出的时候就会自动根据设置的替换规则自动替换。
使用View类的engine方法设置当前视图输出的模板解析引擎,如果没有指定模板引擎的话 默认为PHP自身模板。
// 设置模板引擎
return $view->engine('think',['tpl_path'=>MODULE_PATH.'view/','cache_path'=>MODULE_PATH.'cache/','compile_type'=>'File'])->fetch();
模板引擎的参数根据不同的模板引擎而异。
视图类的模板引擎驱动位于think\view\driver\
目录下面,可以自行扩展。
Think模板引擎的驱动类实现如下:
namespace think\view\driver;
use think\Template;
class Think {
private $template = null;
public function __construct($config=[]){
$this->template = new Template($config);
}
public function fetch($template,$data=[],$cache=[]){
if(is_file($template)) {
$this->template->display($template,$data,$cache);
}else{
$this->template->fetch($template,$data);
}
}
}
模板引擎驱动类需要实现的接口方法就是fetch方法。
如果你不需要任何模板引擎,直接使用原生PHP作为模板解析的话,可以使用
$view->engine('php')->fetch();
如果全局使用的话,还可以直接配置:
'engine_type' => 'php',
绑定数据到模板输出有三种方式:
// 实例化视图类
$view = new \think\View();
$view->assign('name','ThinkPHP');
$view->assign('email','[email protected]');
// 或者批量赋值
$view->assign(['name'=>'ThinkPHP','email'=>'[email protected]']);
// 模板输出
return $view->fetch();
// 实例化视图类
$view = new \think\View();
$view->name = 'ThinkPHP';
$view->email= '[email protected]';
// 模板输出
return $view->fetch();
例如:
return $view->fetch('index',['name'=>'ThinkPHP','email'=>'[email protected]']);
如果希望直接解析内容而不通过模板文件的话,可以使用:
return $view->show($content,$vars);
指定当前的视图模板文件目录:
return $view->config('view_path',MODULE_PATH.'tpl/')->fetch();