使用过tp5一段时间,发现一个面向对象的非常棒的验证层封装方式,特记录一下!
1、定义一个继承与Validate的baseValidate类,实现对参数的获取和发起validate的验证
class BaseValidate extends Validate
{
public function goCheck()
{
// 获取http传入的参数
$request = Request::instance();
// param参数获取的请求参数的键值对
$param = $request->param();
// 发起验证,背后逻辑是 对param按照$rule参数进行验证
$result = $this->check($param);
// 对参数进行校验
if(!$result) {
$error = $this->error;
throw new Exception($error);//简单异常
}else{
return true;
}
}
}
2、按照每一种规则,自定义一个单独的验证器。继承与baseValidate,重写$rule函数,实现自定义的验证
class IdMustBePositiveInt extends BaseValidate
{
// 重写$rule,添加自己的验证器
protected $rule = [
'id' => 'require|isPositiveInteger'
];
/**
* 自定义验证器
*
* @param $value 验证参数的值
* @param $rule
* @param $data 需要验证的参数键值对
* @param $field 验证参数的键
* @return 验证是否通过
*/
protected function isPositiveInteger($value, $rule, $data='', $field = '')
{
if(is_numeric($value) && is_int($value + 0) && ($value + 0) > 0) {
return true;
}else{
return $field.'必须是大于零的整数,请检查';
}
}
}
3、控制器需要验证器的地方不需要单独的对对参数进行验证了,直接获取具体验证器的实例,发起一个goCheck方法就实现了对所有参数的验证
class Banner
{
/**
* 控制器方法
* @param $id
*/
function getBanner($id)
{
// 发起具体验证的gocheck方法,默认获取所有参数并按照rule进行验证,不通过抛出异常
(new IdMustBePositiveInt())->goCheck();
}
}
比较好的使用了面向对象的特性,goCheck方法里调用的check方法会根据rule来进行验证,而在子类里我们重写了rule,相当于实现了自定义验证。因为通过request直接获取了参数键值对,也不需要传参了