Listening to the Words

thinkphp5之post数据过滤

客户端post提交数组数据时,我们首先会对数据进行验证,thinkphp3.2时代,通常是使用tp提供的自动验证功能,即在模型中(D方法)使用自动验证来验证客户端传递过来的数据,然后在存入数据库.

到thinkphp5.0后,tp官方提供了validate验证类,以及官方推荐的验证器,使得后端对客户端提交的数据验证变得更加容易和高效,更是一种AOP思想的体现.

现在有另一一种验证场景:

不仅能对客户端的数据进行验证,同时还能只验证后端定义的数据,多余数据不验证也不存入到数据库

实现方式如下:

验证器预定义的rule


class AddressNew extends BaseValidate { // 为防止欺骗重写user_id外键 // rule中严禁使用user_id // 获取post参数时过滤掉user_id // 所有数据库和user关联的外键统一使用user_id,而不要使用uid protected $rule = [ 'name' => 'require|isNotEmpty', 'mobile' => 'require|isMobile', 'province' => 'require|isNotEmpty', 'city' => 'require|isNotEmpty', 'country' => 'require|isNotEmpty', 'detail' => 'require|isNotEmpty', ]; }

验证器基类定义根据rule过滤参数

 /**
     * @param array $arrays 通常传入request.post变量数组
     * @return array 按照规则key过滤后的变量数组
     * @throws ParameterException
     */
    public function getDataByRule($arrays)
    {
        //过滤恶意提交的字段
        if (array_key_exists('user_id', $arrays) | array_key_exists('uid', $arrays)) {
            // 不允许包含user_id或者uid,防止恶意覆盖user_id外键
            throw new ParameterException([
                'msg' => '参数中包含有非法的参数名user_id或者uid'
            ]);
        }
        $newArray = [];
        foreach ($this->rule as $key => $value) {
            $newArray[$key] = $arrays[$key];//只遍历验证器允许的字段
        }
        return $newArray;
    }

使用方式

        $validate = new AddressNew();//实例化验证器
        $validate->goCheck();//执行验证方法
         $data = $validate->getDataByRule(input('post.'));//验证通过后过滤数组

点赞