前言
Validate可以对参数进行验证,方便我们拦截恶意参数。
Validate有两种主要用法:独立验证
、验证器
。
验证器
首先,总览一下使用验证器的步骤。
步骤:
1)新建一个类,继承think\Validate。
2)该类有一个固定的protected属性rule
如果是自定义的规则的话,可以在类里面使用protected function定义一个函数进行指定。
这个函数的参数按照顺序分别是:验证数据、验证规则、全部数据(数组)、字段名、字段描述。
3)该类有一个固定的protected属性message,可以规定返回的错误信息,key是字段名,值是内容。
4)引入这个类,实例化。
5)使用batch( )处理批量数据校验。
6)使用check( )方法校验是否符合规则。
7)使用getError( )方法获取错误信息。
实例
Count.php(验证类文件)
namespace app\api\validate;
class Count
{
// 字段校验规则
protected $rule = [
'count' => 'isPostiveInteger|between:1,15',
....
];
// 错误提示信息
protected $message = [
'count' => 'count必须是在1~15之间',
...
];
// 自定义验证规则
protected function isPostiveInteger($value,$rule='',$data='',$field=''){
if(is_numeric($value) && is_int($value + 0) && ($value + 0) > 0){
return true;
}else{
return false;
}
}
}
Goods.php(调用验证类的文件)
use app\api\validate\Count;
class Goods
{
$data = [
'count' => '111',
...
];
$validate = new Count();
$validate->batch()->check($data);
if (!$validate) {
dump($validate->getError());
}
}
独立验证
独立验证和验证器最大的区别是它的验证规则、错误提示信息是直接写在上文的。
$validate = new Validate([
'name' => 'require|max:25',
'email' => 'email'
]);
$data = [
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com'
];
if (!$validate->check($data)) {
dump($validate->getError());
}
构建Validate验证层
BaseValidate类
1)建立一个BaseValidate类,继承think\Validate。
2)BaseValidate类有一个goCheck方法,可以调用check方法检测参数是否符合规则。其实就是封装了一下原来的check方法。
对应的validate类
1)新建对应的validate类,继承BaseValidate类。
2)该类有一个固定的protected属性rule。
如果是自定义的规则的话,可以在类里面使用protected function定义一个函数进行指定。
3)还有一个固定的protected属性rule,可以指定错误信息。
Model层
实例化对应的validate类,调用goCheck()方法校验。
一起来看看简单的例子:
BaseValidate类
// 统一验证()方法
public function goCheck(){
// 1.参数
$params = input('param.');
// 2.校验参数是否合规
$result = $this->batch()->check($params);
// 3.不符合就抛出异常
if(!$result){
$e = new ParameterException([
'msg' => $this->error // 来自于validate类
]);
throw $e;
}else{
return true;
}
}
对应的validate类
class AppTokenGet extends BaseValidate
{
// 字段校验规则
protected $rule = [
'ac' => 'require|isNotEmpty',
'se' => 'require|isNotEmpty'
];
}
控制器文件
$validate = new AppTokenGet ();
$validate->goCheck();