ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
视图功能由`\think\View`类配合视图驱动(模板引擎)类一起完成,目前的内置模板引擎包含PHP原生模板和Think模板引擎。 因为新版的控制器可以无需继承任何的基础类,因此在控制器中如何使用视图取决于你怎么定义控制器。 ## **没有继承`\think\Controller`类** ``` return new \think\View\View()->fetch('index'); ``` ## **继承`\think\Controller`类** 如果你的控制器继承了`\think\Controller`类的话,则无需自己实例化视图类,可以直接调用控制器基础类封装的相关视图类的方法。 ~~~ // 渲染模板输出 return $this->fetch('hello',['name'=>'thinkphp']); 或者 return $this->view->fetch('hello',['name'=>'thinkphp']); ~~~ 下面的方法可以直接被调用: | 方法 | 说明 | | --- | --- | | fetch | 渲染模板输出 | | display | 渲染内容输出 | | assign | 模板变量赋值 | | engine | 初始化模板引擎 | 如果需要调用View类的其它方法,可以直接使用`$this->view`对象: ## **助手函数** 无论你是否继承`think\Controller`类,助手函数都可以使用,也是最方便的一种。可以完成相同的功能: ~~~ return view('hello',['name'=>'thinkphp']); ~~~ 助手函数调用格式: > ### view('\[模板文件\]'\[,'模板变量(数组)'\]\[,模板替换(数组)\]) # **模板赋值** 赋值完成后通过view模版调用 ### **`assign($name, $value = '')`方法** ~~~ namespace index\app\controller; class Index extends \think\Controller { public function index() { // 模板变量赋值 $this->assign('name','ThinkPHP'); $this->assign('email','thinkphp@qq.com'); // 或者批量赋值 $this->assign([ 'name' => 'ThinkPHP', 'email' => 'thinkphp@qq.com' ]); // 模板输出 return $this->fetch('index'); } } ~~~ ### 传入参数方法 方法fetch 及 display 均可传入模版变量,例如 ~~~ namespace app\index\controller; class Index extends \think\Controller { public function index() { return $this->fetch('index', [ 'name' => 'ThinkPHP', 'email' => 'thinkphp@qq.com' ]); } } ~~~ ~~~ class Index extends \think\Controller { public function index() { $content = '{$name}-{$email}'; return $this->display($content, [ 'name' => 'ThinkPHP', 'email' => 'thinkphp@qq.com' ]); } } ~~~ ### 助手函数 如果使用view助手函数渲染输出的话,可以使用下面的方法进行模板变量赋值: ~~~ return view('index', [ 'name' => 'ThinkPHP', 'email' => 'thinkphp@qq.com' ]); ~~~ ### `share`方法 `V5.0.4+`开始,支持在任何地方使用静态方法进行模板变量赋值,例如: ~~~ think\View::share('name','value'); // 或者批量赋值 think\View::share(['name1'=>'value','name2'=>'value2']); ~~~ # **模板渲染(模版输出)** 渲染模板最常用的是继承系统的控制器基类后调用`fetch`方法,渲染输出不需要写模板文件的路径和后缀.调用格式: `fetch($template = '', $vars = [], $replace = [], $config = [], $renderContent = false)` fetch(['模板文件'][,模板变量(数组)][, '替换内容']) ~~~ // 不带任何参数 自动定位当前操作的模板文件 // 当前模块/默认视图目录/当前控制器(小写)/当前操作(小写).html //如getHelloWorld方法对应的模版文件则是get\_hello\_world.html return $this->fetch(); // 指定模板输出 //表示调用当前控制器下面的edit模板 return $this->fetch('edit'); //表示调用Member控制器下面的read模板 return $this->fetch('member/read'); return $this->fetch('admin@member/edit'); //你的项目里面可能根本没有Public控制器,更没有Public控制器的menu操作,但是一样可以使用 return $this->fetch('public/menu'); //支持在渲染输出的时候传入模板变量 return $this->fetch('read', ['a'=>'a','b'=>'b']); //支持从视图根目录开始读取模板 //当前模块(admin)/默认视图目录(view)/menu.html $this->fetch('/menu'); // 指定一个完整的模板文件位置,这种方式需要带模板路径和后缀 //./是相对于应用的入口文件如默认在public下的index.php return $this->fetch('./template/public/menu.html'); //全路径模板调用: return $view->fetch(APP_PATH.request()->module().'/view/public/header.html'); ~~~ # **模板输出替换** `v5.0.4+`增加`__ROOT__``__STATIC__``__JS__`和`__CSS__`内置替换规则 ``` __ROOT__ :项目目录 __STATIC__ :项目目录下的static目录 __JS__ :项目目录下的static/js目录 __CSS__:项目目录下的static/css目录 ``` 对视图输出的内容进行字符替换 ~~~ return $this->fetch('member/read',[],['__PUBLIC__'=>'/public/']); ~~~ ### **全局替换** 可以直接在配置文件中添加: ~~~ 'view_replace_str' => [ '__PUBLIC__'=>'/public/', '__ROOT__' => '/', ] ~~~ 然后就可以直接使用 ~~~ namespace index\app\controller; class Index extends \think\Controller { public function index() { $this->assign('name','thinkphp'); return $this->fetch('index'); } } ~~~ 助手函数`view`也支持全局配置参数`view_replace_str`的设置,如果需要设置不同的替换参数,可以使用: ~~~ //在渲染模板或者内容输出的时候就会自动根据设置的替换规则自动替换![](https://img.kancloud.cn/b1/69/b169246cb12d8bffc03fbc32ead6f1a4_1366x768.png) return view('index',['name'=>'thinkphp'],['__PUBLIC__'=>'/public/']); ~~~ ## **自定义模板路径** 如果你的模板文件位置比较特殊或者需要自定义模板文件的位置,可以采用下面的几种方式处理。 ### 渲染完整模板 ~~~ return $this->fetch('./template/public/menu.html'); ~~~ 这种方式需要带模板路径和后缀指定一个完整的模板文件位置,这里的`template/public`目录是位于当前项目入口文件位置下面。如果是其他的后缀文件,也支持直接输出,例如: ~~~ return $this->fetch('./template/public/menu.tpl'); ~~~ 只要`./template/public/menu.tpl`是一个实际存在的模板文件。 > 要注意模板文件位置是相对于应用的入口文件,而不是模板目录。 ## 渲染内容 如果希望直接解析内容而不通过模板文件的话,可以使用`display`方法: ~~~ return $this->display($content,$vars); ~~~ # **内置模板引擎** 可以通过下面的几种方式对模板引擎进行初始化。 ### **①配置文件** 在应用配置文件中配置`template`参数即可,然后调用视图类进行操作或者使用`view`助手函数的时候会自动实例化相关的模板引擎并传入参数例如: ~~~ 'template' => [ // 默认模板渲染规则 1 解析为小写+下划线 2 全部转换小写 'auto_rule' => 1, // 模板引擎类型 支持 php think 支持扩展 'type' => 'Think', // V5.0.3+ 视图基础目录,配置目录为所有模块的视图起始目录 //用于定义全局的视图根目录,然后模块作为子目录 'view_base' => '', // 当前模块的模板视图目录 留空为自动获取 'view_path' => '', // 模板后缀 'view_suffix' => 'html', // 模板文件名分隔符 'view_depr' => DS, // 模板引擎普通标签开始标记 'tpl_begin' => '{', // 模板引擎普通标签结束标记 'tpl_end' => '}', // 标签库标签开始标记 'taglib_begin' => '{', // 标签库标签结束标记 'taglib_end' => '}', ], ~~~ ### 视图根目录 视图文件的根目录默认情况下位于模块的`view`目录,每个模块的视图目录可以通过模板参数`view_path`自定义。 `V5.0.3+`版本开始,新增了`view_base`模板引擎参数,可以用于定义全局的视图根目录,然后模块作为子目录。 ### **②调用engine方法初始化** 视图类也提供了`engine`方法对模板解析引擎进行初始化或者切换不同的模板引擎,例如: ~~~ return $this->engine('php')->fetch(); ~~~ 表示当前视图的模板文件使用原生php进行解析。 ## **③使用第三方模板引擎** 官方扩展库中提供了一个类似于`angularjs`语法的模板引擎`think-angular`,具体可以参考[参考手册](http://www.kancloud.cn/shuai/php-angular)