字段的验证算是开发中占比较重的一环,每个PHP框架的字段验证方式基本一致,都各自的验证类,方法大同小异。基本原则大概就是一张表对应一个模型对应一个验证类。每个字段都设置相应的规则和提示信息,如果有场景设置的话,单独给每个场景单独设置一个方法,存储该方法对应的字段。最后统一用一个方法作为验证入口,最后接管异常,有异常直接抛出返回,可以省去很多if语句判断。
- 验证类,字段和提示
/**
* 验证规则
*
* @var array
*/
protected $rule = [
'division_id' => 'require',
'getMode' => 'require',
'level_name' => 'require',
'level_min_vote' => 'require',
'level_max_vote' => 'require',
'level_type' => 'require'
];
//验证提示信息
protected $message = [
'division_id.require' => '赛区ID不能为空',
'getMode.require' => 'getMode参数不能为空',
'level_name.require' => '等级名称不能为空',
'level_min_vote.require' => '等级最小票数不能为空',
'level_max_vote.require' => '等级最大票数不能为空',
'level_type.require' => '等级类型不能为空',
];
2.为每个场景设置独立的验证。
// save 验证场景定义
public function sceneSave()
{
return $this->only(['level_name', 'level_min_vote', 'level_max_vote', 'level_type', 'division_id']);
}
// edit 验证场景定义
public function sceneEdit()
{
return $this->only(['level_name', 'level_min_vote', 'level_max_vote', 'level_type']);
}
// index 验证场景定义
public function sceneIndex()
{
return $this->only(['division_id','getMode']);
}
3.设置验证的统一入口,方便管理和扩展
public function checkData(Request $request, $scene = 'index')
{
$result = $this->scene($scene)->check($request->param());
if (!$result) {
throw new ParameterException($this->getError());
}
return true;
}
该场景验证可以单独再根据验证的场景,验证一些复杂的字段,字段验证失败之后,直接抛出异常,最后由异常类接收直接抛出异常,可减少大量的if语句。