ThinkPHP实现一个复杂的参数验证器

需求

客户端传来这样一个 json 数据,服务端需要对数据进行验证。验证数据格式是否正确

{
    "products": [
         {
             "product_id": 1,
             "count": 3
         },
         {
             "product_id": 2,
             "count": 3
         },
         {
             "product_id": 3,
             "count": 3
         }
    ]
}

在 ThinkPHP 5 中,如果使用一般的 Validate 无法实现,还需要另外写一个代码来实现。

数据格式

  • products 是一个数组
  • 数组元素的格式是 { "product_id": 1, "count": 3 }

代码实现

BaseValidate

param();
        // 对这些参数做校验
        $result = $this->batch()->check($params);
        if ($result) {
            return true;
        } else {
            throw new ParameterException([
                'msg' => $this->error
            ]);
        }
    }

    /**
     * 自定义验证规则:判断是否是正整数
     */
    protected function isPositiveInteger($value, $rule = '', $data = '', $field = '')
    {
        if (is_numeric($value) &&
            is_int($value + 0) &&
            ($value + 0) > 0) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 不能为空
     */
    protected function isNotEmpty($value, $rule = '', $data = '', $field = '')
    {
        if (empty($value)) {
            return false;
        } else {
            return true;
        }
    }
}

OrderPlace

 'checkProducts'
    ];

    protected $singleRule = [
        'product_id' => 'require|isPositiveInteger',
        'count' => 'require|isPositiveInteger',
    ];

    protected function checkProducts($values)
    {
        if (!is_array($values)) {
            throw new ParameterException(
                [
                    'msg' => '商品参数不正确'
                ]);
        }

        if (empty($values)) {
            throw new ParameterException(
                [
                    'msg' => '商品列表不能为空'
                ]);
        }

        foreach ($values as $value) {
            $this->checkProduct($value);
        }
        return true;
    }

    protected function checkProduct($value)
    {
        $validate = new BaseValidate($this->singleRule);
        $result = $validate->check($value);
        if (!$result) {
            throw new ParameterException([
                'msg' => '商品列表参数错误',
            ]);
        }
    }
}

BaseException

code = $params['code'];
        }

        if (array_key_exists('msg', $params)) {
            $this->msg = $params['msg'];
        }

        if (array_key_exists('errorCode', $params)) {
            $this->errorCode = $params['errorCode'];
        }
    }
}

ParameterException

使用

在 Controller 中使用

goCheck();  // 验证参数
        
        // ...
    }
}

你可能感兴趣的:(ThinkPHP实现一个复杂的参数验证器)