视图功能由`\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)
- 目录结构与基础
- 修改数据后页面无变化
- 防跨目录设置
- input
- 系统目录
- 自动生成的文件以及目录
- 类自动加载
- url生成
- 数据增删改查
- 增加数据
- 数据更新
- 数据删除
- 数据查询
- 架构
- 生命周期
- 入口文件
- URL访问规则
- 配置
- 默认惯例配置配置
- 初始应用配置
- 路由
- 域名路由
- URL生成
- 数据库操作
- 方法列表
- 连接数据库
- 分布式数据库
- 查询构造器
- 查询数据
- 添加数据
- 更新数据
- 删除数据
- 查询语法
- 聚合查询(统计)
- 时间查询
- 高级查询
- 视图查询
- 子查询
- 辅助查询之链式操作
- where
- table
- alias
- field
- order
- limit
- page
- group
- having
- join
- union
- distinct
- lock
- cache
- comment
- fetchSql
- force
- bind
- partition
- strict
- failException
- sequence(pgsql专用)
- 查询事件
- 事务操作
- 监听SQL
- 存储过程
- 数据集
- 控制器
- 跳转和重定向
- 空控制器和空操作
- 分层控制器
- Rest控制器
- 资源控制器
- 自动定位控制器
- tp3的增删改查
- 方法注入
- 模型
- 属性方法一览
- 类方法详解
- Model
- 调用model不存在的属性
- 调用model中不存在的方法
- 调用model中不存在的静态方法
- hasOne
- belongsTo
- hasMany {Relation}
- belongsToMany
- hasManyThrough
- morphMany
- morphOne
- morphTo
- ::hasWhere {Query}
- ::has
- relationCount
- data 【model】
- setInc {integer|true}
- setDec {integer|true}
- save {integer | false}
- saveAll {array}
- delete {integer}
- ::get 查询单条数据 {Model}
- ::all 查询多条数据{Model [ ]}
- ::create 新增单条数据 {Model}
- ::update 更新单条数据 {Model}
- ::destroy {integer}
- ::scope {Query}
- getAttr {mixed}
- xxx
- append
- appendRelationAttr
- hidden
- visible
- except
- readonly
- auto
- together
- allowField
- isUpdate
- validate
- toCollection
- toJson
- toArray
- 定义
- 新增
- 更新
- 查询
- 删除
- 聚合
- 获取器
- 修改器
- 时间戳
- 只读字段
- 软删除
- 类型转换
- 数据完成
- 查询范围
- 模型分层
- 数组访问和转换
- JSON序列化
- 事件
- 关联
- 一对一关联
- 主表一对一关联
- 从表一对一关联(相对关联)
- 一对多关联
- 主表定义一对多关联
- 从表定义一对多关联
- 远程一对多
- 多对多关联
- 多态关联
- 动态属性
- 关联预载入with()
- 关联统计
- N+1查询
- 聚合模型
- Model方法集合
- 表单验证
- 验证器
- 验证规则
- 错误信息
- 验证场景
- 控制器验证
- 模型验证
- 内置规则
- 静态调用
- 表单令牌
- Token身份令牌
- 视图
- 模版
- 变量输出
- 函数输出
- Request请求参数
- 模板注释及原样输出
- 三元运算
- 内置标签
- 模板继承
- 模板布局
- 日志
- 日志初始化
- 日志驱动
- 日志写入
- 独立日志
- 日志清空
- 写入授权
- 自定义日志
- 错误和调试
- 异常
- php系统异常及thinkphp5异常机制
- 异常处理
- 抛出异常
- 异常封装
- resful
- 404页面
- 调试模式
- Trace调试
- SQL调试
- 变量调试
- 性能调试
- 远程调试
- 安全
- 输入安全
- 数据库安全
- 上传安全
- 其它安全建议
- xss过滤
- 扩展
- 函数
- 类库
- 行为
- 驱动
- Composer包
- Time
- 数据库迁移工具
- Workerman
- MongoDb
- htmlpurifier XSS过滤
- 新浪SAE
- oauth2.0
- 命令行及生成文件
- 系统现成命令
- 创建类库文件
- 生成类库映射文件
- 生成路由缓存
- 清除缓存文件
- 生成配置缓存文件
- 生成数据表字段缓存
- 自定义命令行
- 开始
- 调用命令
- 杂项
- 助手函数
- URL重写
- 缓存
- 缓存总结
- Session
- Cookie
- 多语言
- 分页
- 上传
- 验证码
- 图像处理
- 文件处理
- 单元测试
- 自定义表单令牌