今天看到了一个全局验证层的代码封装,感觉挺实用的,所以在这里做个记录。
首先创建基类验证器,和一个需要使用的验证其,执行如下代码:
//创建基类验证器
php think make:validate BaseVlidate
//创建一个用户登录验证器
php think make:validate LoginVlidate
两个验证器创建好了之后我们就开始写代码封装了。
LoginVlidate.php文件代码如下:
<?php
declare (strict_types = 1);
namespace app\validate;
class LoginVlidate extends BaseVlidate
{
/**
* 定义验证规则
* 格式:'字段名' => ['规则1','规则2'...]
*
* @var array
*/
protected $rule = [
'username'=>'require',
'password'=>'require',
'email'=>'require|email'
];
/**
* 定义错误信息
* 格式:'字段名.规则名' => '错误信息'
*
* @var array
*/
protected $message = [
'username.require'=>'用户名必须填写',
'email.email'=>'邮箱格式不正确',
'email.require'=>'邮箱不能为空'
];
// 验证场景
protected $scene = [
//登录场景验证
'login' => ['username','email'],
];
}
BaseVlidate.php文件代码如下:
<?php
declare (strict_types = 1);
namespace app\validate;
use think\Validate;
use app\lib\exception\BaseException;
class BaseVlidate extends Validate
{
public function goCheck($scene = ''){
//获取接收到的数据
$params = request()->param();
//用三元运算符判断是否存在场景验证,并返回给$check变量
$check = empty($scene)?$this->check($params):$this->scene($scene)->check($params);
//开始判断验证
if(!$check){
//这里需要注意的是我用的异常返回,也可以使用return,但是方法里面需要接收返回的return数据
throw new BaseException(['message'=>$this->getError(),'code'=>500,'errorCode'=>10000]);
}
halt($params);
}
}
定义好了之后我们只需要在方法里面执行验证即可。
//首先引入我们的验证器(验证器需继承基类验证器)
use app\validate\LoginVlidate;
下面为控制器里面的方法调用内容--------------
//现在我们实例化验证器并调用(无场景验证)
(new UserVlidate())->goCheck();
//现在我们实例化验证器并调用(带场景验证)
(new UserVlidate())->goCheck('login');