数据验证层,顾名思义,负责验证数据的,主要是前端传递过来的参数。作为后端工程师,不要相信任何前端传递过来的数据,这点一定要切记。
在以前,写验证一般会写到控制器中,写一堆IF,或者直接传入到相应逻辑类中使用的时候验证,这样是很不灵活的,例如同样一个ID的判断,同样是必填和正整数,按以前的写法就需要在不同的地方写同样的代码,虽然可能只有两三行代码,但是位置多了也很恐怖,更可怕的是万一有一天说这个ID必须小于100。
TP5的验证类validate使用是非常简单的,NEW时候传入规则,然后调用check方法传入验证数据就可以了,支持批量验证。可以通过getError方法获取未通过验证的信息。
$validate = new \think\Validate([
['id', 'require', '必填'],
]);
//验证部分数据合法性
if (!$validate->check($post)) {
$this->error('提交失败:' . $validate->getError());
}
不过这样写下去代码量也会很多。今天学的一个是专门定义一个验证层,把验证代码放到单独的类里,控制器引用的时候只需要new自定义验证类就可以了。 结构如下 BaseValidate 继承Validate,负责调用验证方法。 IDMustBePositiveInt继承BaseValidate,定义验证规则。
BaseValidate类:
<?php
namespace app\api\validate;
use think\Validate;
/**
* Class BaseValidate
* 验证类的基类
*/
class BaseValidate extends Validate
{
/**
* 检测所有客户端发来的参数是否符合验证类规则
* 基类定义了很多自定义验证方法
* 这些自定义验证方法其实,也可以直接调用
* @throws ParameterException
* @return true
*/
public function goCheck()
{
//必须设置contetn-type:application/json
$request = Request::instance();
$params = $request->param();
$params['token'] = $request->header('token');
if (!$this->check($params)) {
$exception = new ParameterException(
[
// $this->error有一个问题,并不是一定返回数组,需要判断
'msg' => is_array($this->error) ? implode(
';', $this->error) : $this->error,
]);
throw $exception;
}
return true;
}
}
IDMustBePositiveInt类
<?php
namespace app\api\validate;
class IDMustBePositiveInt extends BaseValidate
{
protected $rule = [
'id' => 'require|isPositiveInteger',
];
}