一.验证器定义
1. 验证器的使用,我们必须先定义它,系统提供了一条命令直接生成想要的类;
php think make:validate User
2. 这条命令会自动在应用目录下生成一个validate文件夹,并生成User.php类;
class User extends Validate
3. 自动生成了两个属性:$rule表示定义规则,$message表示错误提示信息;
protected $rule = [
'name'
=>
'require|max:20',
'price'
=>
//不得为空,不得大于20位
'number|between:1,100', //必须是数值,1-100 之间
'email'
=>
'email'
];
protected $message = [
'name.require'
=>
'姓名不得为空',
'name.max'
=>
'姓名不得大于20位',
'price.number'
=>
'价格必须是数字',
'price.between'
=>
'价格必须1-100之间',
'email'
=>
'邮箱的格式错误'
];
4. 如果不设置$message定义的话,将提示默认的错误信息;
5. 验证器定义好了之后,我们需要进行调用测试,创建一个Verify.php控制器;
try {
validate(User::class)->check([
'name' => '蜡笔小新',
'price' => 90,
'email' => 'xiaoxin@163.com'
]);
} catch (ValidateException $e) {
dump($e->getError());
}
6. 默认情况下,出现一个错误就会停止后面字段的验证,我们也可以设置批量验证;
validate(User::class)->batch(true)...
由于出现一个错误,后面就会停止,使用我们要应用batch:
只能显示一个错误,但是后面的两个也是错的。
下面这个图片的batch位置写错了:
正确写法:
7. 系统提供了常用的规则让开发者直接使用,也可以自行定义独有的特殊规则;
protected $rule = [
'name'
=>
'require|max:20|checkName:李炎恢',
];
//自定义规则,名称中不得是“李炎恢”
protected function checkName($value, $rule)
{
return $rule != $value ? true : '名称存在非法称谓';
}
8. 对于自定义规则中,一共可以有五个参数,我们分别了解一下;
protected function checkName($value, $rule, $data, $field, $title)
{
dump($data);
//所有数据信息
dump($field);
//当前字段名
dump($title);
//字段描述,没有就是字段名
}
1. checkName
方法参数传值
$value
:它代表的是被验证字段的实际值。例如,若要验证name
字段,那么$value
就是name
字段在表单提交时所携带的值。$rule
:此为验证规则中自定义规则之后的额外参数。就像'checkName:thinkphp'
里,$rule
的值就是thinkphp
。$data
:它是一个数组,包含了所有需要验证的数据。默认值为空数组[]
,在验证时,整个待验证的数据数组会被传递给这个参数。
9. 如何设置字段描述,只要在字段名用|后设置即可: 'name|用户名' => 'require|max:20|checkName:李炎恢',
<?php
namespace app\validate;
use think\Validate;
class User extends Validate
{
protected $rule = [
'name' => 'checkName:thinkphp',
'email' => 'email',
];
protected $message = [
'name' => '用户名必须',
'email' => '邮箱格式错误',
];
// 自定义验证规则
protected function checkName($value, $rule, $data=[])
{
return $rule == $value ? true : '名称错误';
}
}
// 调用验证类
$validate = new User();
$data = [
'name' => 'thinkphp',
'email' => 'test@example.com'
];
if (!$validate->check($data)) {
dump($validate->getError());
} else {
echo '验证通过';
}
代码解释
- 在上述代码中,当调用
$validate->check($data)
时,name
字段的值'thinkphp'
会被传递给checkName
方法的$value
参数。 'checkName:thinkphp'
里的thinkphp
会被传递给checkName
方法的$rule
参数。- 整个
$data
数组会被传递给checkName
方法的$data
参数。
这样,在checkName
方法中就能依据$value
和$rule
的值进行验证,并返回验证结果。
验证规则
有的时候只对数据进行局部的验证,而不是全局。
1.在上一节验证器定义的时候,我们采用的字符串模式,也支持数组模式;
protected $rule =[
'name' => [
'require',
'max' => 10,
'checkName' => '李炎恢'
],
'price' => [
'number',
'between' => '1,100'
],
'email' => 'email'
];
2.数组模式在验证规则很多很乱的情况下,更容易管理,可读性更高;
3.如果你想使用独立验证,就是手动调用验证类,而不是调用User.php验证类;
第一个是定义规则,第二个是验证规则:
4.这种调用方式,一般来说,就是独立、唯一,并不共享的调用方式;
$validate = Validate::rule([
'name' => 'require|max:20',
'price' => 'number|between:1,100',
'email' => 'email'
]);
$result =$validate->check([
'name' => '李炎恢',
'price' => 90,
'email' => 'xiaoxin163.com'
]);
if(!$result){
dump($validate->getError());
}
5. 独立验证默认也是返回一条错误信息,如果要批量返回所有错误使用batch();
$result = $validate->batch(true)->check
6. 独立验支持对象化的定义方式,但不支持在属性方式的定义;
$validate = Validate::rule([
'name'
=>
ValidateRule::isRequire()->max(20),
'price'
=>
ValidateRule::isNumber()->between([1, 100]),
'email'
=>
ValidateRule::isEmail()
]);
8. 独立验支持闭包的自定义方式,但这种方式会不支持字段的多规则;
$validate = Validate::rule([
'name' => function ($value) {
return $value != '' ? true : '姓名不得为空';
},
'price'=> function ($value) {
return $value > 0 ? true : '价格不得小于零';
}
]);
二.错误信息
1. 独立验证的自定义错误提示,可以在方法的第二参数,参数一是规则;
ValidateRule::isEmail(null, '邮箱格式不正确!');
ValidateRule::isNumber()->between([1, 100], '价格范围1-100 之间')
2. 也可以独立使用message()方法,来设置相关错误信息;
$validate->message([
'name.require' => '姓名不得为空',
'name.max' =>'姓名不可以超过20个子'
]);
'name.require'=>['code'=>1001, 'msg'=>'姓名不得为空']