九、数据验证
1.定义
在对应的模块下的validate文件夹新建和模块一样的文件,引入验证器的命名空间,并继承类。
namespace app\index\validate;
use think\Validate;
class User extends Validate{
protected $rule = [
'字段' => '验证规则|规则条件'
];
protected $message = [
'字段.验证规则' => '错误提示信息'
];
}
定义验证规则的数组$rule,规定要验证的字段、规则、条件、文字提示等。可直接在验证器类中通过message属性定义错误提示信息。
2. 数据验证
在需要进行验证的控制器方法中调用验证类的check方法完成验证。
$data = [
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com',
];
$validate = new \app\index\validate\User;
if (!$validate->check($data)) {
dump($validate->getError());// 验证失败 输出错误信息
}
或使用控制器类提供的validate方法进行验证。
$data = [
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com',
];
$result = $this->validate($data,'app\index\validate\User');
if (true !== $result) {
dump($result);// 验证失败 输出错误信息
}
设置批量验证、验证抛出异常
// 是否批量验证
protected $batchValidate = true;
// 验证失败是否抛出异常
protected $failException = true;
3.验证规则
格式类
规则 | 说明 |
---|---|
require | 字段必须 |
number | 是否为纯数字 |
integer | 是否为整数 |
float | 是否为浮点数 |
boolean | 是否为布尔值 |
是否为邮箱 | |
array | 是否为数组 |
accepted | 是否为yes/no/1 |
date | 是否为有效的日期 |
alpha | 是否为纯字母 |
chs | 只能是汉字 |
ip | 是否为有效的IP地 |
idCard | 身份证 |
zip | 邮政编码 |
规则条件
说明 | 规则 |
---|---|
长度和区间类 | in、notIn、between、notBetween、length、max、min、after、before、expire |
字段比较类 | eq 或 = 或 same 、egt 或 >=、gt 或 > 、elt 或 <=、lt 或 < |
4.定义错误提示
(1)未定义时,使用系统默认的错误提示。
(2)设置字段对应中文名。
'字段|中文名' => '验证规则|规则条件'
(3)使用message属性进行定义。
5.独立验证
直接使用think\Validate类下的make方法进行独立验证,不需要定义验证器类。
$rule = [
'name' => 'require|max:25',
'email' => 'email'
];
$msg = [
'name.require' => '名称必须',
'email' => '邮箱格式错误'
]
$data = [
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com',
];
$validate = Validate::make($rule,$msg);
if (!$validate->check($data)) {
dump($validate->getError());
}
十、视图和模板
1.模板渲染
(1)继承系统控制器,调用fetch方法,其格式为:fetch(’[模板文件]’[,‘模板变量(数组)’])
①无参数:自动定位当前操作的模板文件,其规则是:当前模块/view/当前控制器名/当前操作.html
②[模块@][控制器/][操作]:跨模块、指定控制器、指定模板渲染。
(2)控制器类未继承系统控制器类,使用助手函数view,其格式为:view(’[模板文件]’[,‘模板变量(数组)’])
(3)模板变量赋值:assign。另外,fetch、view方法均可传入模板变量进行赋值。
2.变量输出
过滤方法 | 描述 |
---|---|
date | 日期格式化(包含各种时间类型) |
format | 字符串格式化 |
upper/lower | 转为大写/小写 |
default | 默认值 |
first/last | 输出数组的第一个/最后一个元素 |
raw | 不使用转义 |
多个函数共同过滤时,函数之间用“|”分割,函数会按照从左到右的顺序依次调用。
例如:{$name|md5|upper|substr=0,3}
3.模板布局
(1)全局配置
在项目配置文件中添加相关的布局模板设置,适用于全站使用相同布局的情况。
开启layout_on参数,设置入口文件名layout_name。读取模板后,将解析的内容替换到特定的输出变量{CONTENT}。
return [
'layout_on' => true,
'layout_name' => 'layout',
'layout_item' => '{__CONTENT__}' //模板替换字符,可自定义。
]
{include file="public/header" /}
{__CONTENT__}
{include file="public/footer" /}
不使用模板布局:在模板文件开头加上{__NOLAYOUT__}
(2)模板标签
直接在模板文件头部中增加布局标签(布局模板):{layout name="layout" /}
(3)动态布局
内置的layout方法可以灵活的控制局部模板布局的开启和关闭。
4.模板继承
定义一个基础模板,并定义相关的区块block。当子模板继承extend基础模板时,就会对基础模板中的区块进行替换。