我们在写网站和软件交互的时候,通常有js的判断。但就是我在前端JS已经做了些判断,比如什么内容不能为空,邮箱格式是否错误。那我为啥还需要在后端的时候,还需要写一个验证器呢。我在thinkPHP的交流QQ群中,为我解答了疑惑。大概是两点:
1.前端的判断,是为了更友好的交互,但后端的验证是为了数据库的安全,不受被攻击。比如,精通编程的人,会直接绕过前端的验证,来对后端直接访问。
2.我们会接受客户端传来的参数,这些个参数是不可信的,我们后端开发人员必须对这个参数进行验证。
我这里就总结下我的验证器代码习惯:
第一种是我一开始写的:
$rule = [
'goods_name' => 'require',
'attribute_list' =>'require',
'album_group' =>'require',
'album_cover'=>'require',
'__token__' => 'token',
];
$msg = [
'goods_name.require' => '分类id不能为空',
'attribute_list' =>'商品属性值不能为空',
'album_group' =>'轮播图不能为空',
'album_cover'=>'封面图不能为空',
'__token__.token' => 'Token is fall'
];
$validate = new Validate ($rule, $msg);
$res = $validate->check($_POST);
if (!$res) {
$this->ajaxReturn('1', $validate->getError());
}
你会发现这样写,如果有很多验证器规则,你是不是需要写很多行。而且在同一个控制器中,有很多验证器的规则是会重复的,这就会让代码重复性太高,不够简洁。于是就有了下面第二种,我今天改版的简洁验证。
第二种方式就是我今天改过的:我觉得代码能够简化就简化,十几行代码能搞定的事情,干嘛非要四五十行。所以代码能少则少,这样看着美观点。rule是规则,message是验证消息,scene是验证场景(这是可以用来做多场景的判断)
控制器中的代码:这个ajaxreturn是我封装的一个方法,输出jsoncode形式,这里很简单我就不贴了
$res =$this->validate($_POST,'Commdodity.comm');
if (true!==$res){
$this->ajaxReturn('1',$res);
}