tp5-验证器

验证器

验证器可以利用写好的规则进行快速的验证并且提示出错误信息

验证使用独立的think\Validare

//任何时候,都可以使用Validate类进行独立的验证操作
$validate = new Validate([
    'name'  => 'require|max:25',
    'email' => 'email'
]);
$data = [
    'name'  => 'thinkphp',
    'email' => 'thinkphp@qq.com'
];
if (!$validate->check($data)) {
    dump($validate->getError());
}

验证使用验证器进行验证

//定义一个\app\index\validate\User验证器类用于User的验证
namespace app\index\validate;
use think\Validate;
class User extends Validate
{
    protected $rule = [
        'name'  =>  'require|max:25',
        'email' =>  'email',
    ];
}
//在需要进行User验证的地方,添加如下代码即可:
$data = [
    'name'=>'thinkphp',
    'email'=>'thinkphp@qq.com'
];

$validate = Loader::validate('User');
if(!$validate->check($data)){
    dump($validate->getError());
}
//Loader-加载|check-校验
//使用助手函数实例化验证器
$validate = validate('User');

验证规则

设置规则

详情见tp5官方开发手册

规则定义

$rules=['name'=>'require'];中使用多个规则有两种方法可供选择

1.使用管道符'name'=>'require|max:25'

2.使用数组'name'=>['require','max'=>25]

属性定义

protected $rule =   ['name'  => 'require|max:25'];
protected $message  =   [
        'name.require' => '名称必须',
        'name.max'     => '名称最多不能超过25个字符'
        ];

数据验证(含批量,控制器类,闭包,自定义)

$rule=['name'=>'require|max:25',];
$msg=['name.require'=>'名称必填',];
$data=['name'=>'admin123'];
//普通验证
$validate=new Validate($rule,$msg);
$result=$validate->check($data);
//批量验证
$validate=new Validate($rule,$msg);
$result=$validate->batch()->check($data);
//使用定义的验证器验证
$validate = Loader::validate('User');
if(!$validate->check($data)){
    dump($validate->getError());
}
//闭包函数验证
$validate = new \think\Validate([
    'name'  => function($value,$data) { 
    //第一个参数是当前字段值,第二个参数是全部数据
        return 'thinkphp'==$value ? true : false;
    },
]);
//自定义验证规则
class User extends Validate
{
    protected $rule = [
        'name'  =>  'checkName:thinkphp',
        'email' =>  'email',
    ];
    protected $message = [
        'name'  =>  '用户名必须',
        'email' =>  '邮箱格式错误',
    ];
    // 自定义验证规则
    protected function checkName($value,$rule,$data)
    {
        //$value,$rule,$data,$fieldname,$description
        //验证数据,验证规则,全部数据(数组),字段名,字段描述
        return $rule == $value ? true : '名称错误';
    }
}

错误信息

  • 使用默认的错误提示信息(默认)
  • 验证规则和提示信息分开(推荐)
  • 验证规则和提示信息一起定义
  • 使用多语言(不常用)

验证场景

场景验证只验证场景中规定的字段

//验证不同场景
$rule=[...];
$msg=[...];
$data=[...];
$validate = new Validate($rule);
$validate->scene('edit', ['name', 'age']);
$result = $validate->scene('edit')->check($data);

//使用验证器类
protected $rule=[];
protected $message=[];
protected $scene=['edit'=>['name','age']];
//然后在需要验证的地方使用scene方法
$data=[...];
$validate=new \app\index\validate\User($rule);
$result=$validate->scene('edit')->check($data);

也可以在定义场景的时候对某些字段的规则重新设置

protected $scene=[
        'edit'=>['name','age'=>'require|number|between:1,120'],
    ];

scene-场景


验证方式:验证器验证(首选)、控制器的验证方法验证、模型类的方法验证(废弃)
验证规则:内置了非常丰富的内置规则;自定义规则;
错误信息:只需要定义信息文字即可在出现错误时返回错误信息
验证场景:根据需要在不同的情况下灵活使用已经定义好的验证规则->scene('场景')
高级的使用:批量验证(返回的错误是数组;每个字段是一个元素;每个字段只返回一个错误)、表单令牌(跨域提交csrf跨站脚本攻击)


*内置规则

require-必须number/integer/float-数字email-邮箱地址array-数字
accepted-yes/no/1date-日期alpha-字母alphaNum-字母和数字
alphaDash-字母/数字/_/-chs-汉字chsAlpha-汉字/字母chsAlphaNum-汉字/字母/数字
chsDash-汉字/字母/数字/_/-activeUrl/url/ipdateFormat:format:y-m-d-指定格式日期length
max/minin/notIn/between/notBetweenafter:日期-之前before:日期-之后
expire:开始时间,结束时间confirm:-比较另一个字段值different:-比较另一值不一致eq/same-等于某个值
eqt/>=-大于等于gt/>-大于elt/<=-小于等于lt/<-小于
正则上传行为其他验证

控制器验证

[验证方式①]验证器验证:定义一个验证器的类,在控制器中进行验证
验证成功:返回true;
验证失败:返回false;如果需要获取错误信息:$validate->getError();

$validate = Loader::validate('Users');
$result = $validate->check($post);
//$result = $validate->batch(true)->check($post);
if(!$result){
    //var_dump($validate->getError());
    $this->error($validate->getError());
    //return json($validate->getError());
}

[验证方式②]控制器的验证方法:
验证成功:返回true;
验证失败:返回错误信息;

  • @param array $data 数据
  • @param string|array $validate 验证器名或者验证规则数组
  • @param array $message 提示信息
  • @param bool $batch 是否批量验证
  • @param mixed $callback 回调方法(闭包)
$result = $this->validate($post,'Users');
//$result = $this->validate($post,'Users',[],true);
if(true !== $result){
//var_dump($result);
     $this->error($result);
    }
exit("验证通过!");
ThinkPHP

我来吐槽

*

*