# TP验证器

# 使用说明

注意!所有验证器需继承 `\yunj\core\Validate`。

代码示例:

namespace app\demo\validate;

class Demo extends \yunj\core\Validate{
    ...
}

# 自动处理

说明

在验证数据前,通过调用验证器 auto 方法,设置自动抛出错误消息开启。

方法:auto(bool $enable)

参数:

参数 类型 说明
enable bool 是否开启自动抛出错误消息,默认true

返回值:当前验证器对象

示例:

namespace app\demo\controller;

use app\demo\validate\Example as ExampleValidate;

class Exampler{
    
    // 数据更新
    public function update(){
        $validate = new ExampleValidate();
        $data = input('post.');
        $validate -> auto() -> check($data);
        $data = $validate->getData();
        // ...后续业务操作
    }

}

$validate -> auto() -> check($data)执行流程分析如下:

  • 有错误产生 当前请求为 ajax 类型请求时,会通过 throw_error_json($error) 直接像浏览器抛出异常的 json 数据,结束程序的执行;反之则会跳转到错误页面,并显示错误消息。
  • 没有错误产生 调用 check($data) 方法后会返回结果 true

# 数据处理

说明

在验证器常规的规则校验通过后,可在验证器中书通过 handleData 方法对数据进行进一步的处理。

方法:handleData(array &$data,$scene):void

参数:

参数 类型 说明
data array 原始传入的校验数据,调用验证器 check($data) 方法时传入的数据
scene string|mixed 校验场景

示例

  • 验证器:
    namespace app\demo\validate;
    
    use think\Db;
    
    final class FormDemo extends Validate {
    
        protected $rule = [
            'username' => 'require',
            'password' => 'require',
        ];
    
        protected $message = [
            'username.require' => '[账户]不能为空',
            'password.require' => '[密码]不能为空',
        ];
    
        protected $scene = [
            'Test' => ['username', 'password'],
        ];
    
        protected function handleData(array &$data, $scene): void{
            switch ($scene) {
                case "Test":
                    // 检查username是否存在
                    $hasExist = Db::name("member")->where([["username", "eq", $data["username"]]])->value("id");
                    if ($hasExist) {
                        // 可通过调用方法 throw_error_json 或抛出异常 Exception 的方式设置错误信息,并返回验证失败
                        // 方式1
                        throw_error_json("[账户]已存在");
                        // 方式2
                        //throw new \Exception("[账户]已存在");
                    }
                    break;
            }
        }
        
    }
    
  • 验证器调用:
    $data = [
        "username" => "xiaowang",
        "password" => "123456",
    ];
    $validate = new \app\demo\validate\FormDemo();
    $res = $validate->scene("Test")->check($data);
    if ($res) {
        // 验证通过,获取处理后的数据
        $data = $validate->getData();
        dump($data);
    } else {
        // 验证失败,获取失败信息
        $error = $validate->getError();
        dump($error);
    }