Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

多数据校验 - CheckStruct

CheckStruct的使用方式同CheckMap,除了第一个参数为struct类型的结构体对象(也可以是对象指针)。但是需要注意的一个细节是,struct的属性会有默认值,在某些情况下会引起required规则的失效,因此根据实际情况配合多种规则一起校验会是一个比较严谨的做法。

...

func CheckStruct(object interface{}, rules interface{}, msgs ...CustomMsg) *Error

示例1,使用map指定规则及提示信息

package main

import (
    "github.com/gogf/gf/frame/g"
    "github.com/gogf/gf/util/gvalid"
)

func main() {
    type Object struct {
        Name string
        Age  int
    }
    rules := map[string]string {
        "Name" : "required|length:6,16",
        "Age"  : "between:18,30",
    }
    msgs  := map[string]interface{} {
        "Name" : map[string]string {
            "required" : "名称不能为空",
            "length"   : "名称长度为:min到:max个字符",
        },
        "Age"  : "年龄为18到30周岁",
    }
    obj := Object{Name : "john"}
    // 也可以是指针
    // obj := &Object{Name : "john"}
    if e := gvalid.CheckStruct(obj, rules,msgs); e != nil {
        g.Dump(e.Maps())
    }
}

/*
输出:
{
	"Age": {
		"between": "年龄为18到30周岁"
	},
	"Name": {
		"length": "名称长度为6到16个字符"
	}
}
*/

在以上示例中,Age属性由于默认值0的存在,因此会引起required规则的失效,因此这里没有使用required规则而是使用between规则来进行校验。

示例2,使用gvalid tag绑定规则及错误信息

使用gvalid tag设置的规则,其校验结果是顺序性的。

...

{
	"name": {
		"length": "用户名称长度非法"
	},
	"password2": {
		"password3": "密码格式不合法,密码格式为任意6-18位的可见字符,必须包含大小写字母、数字和特殊字符",
		"same": "两次密码不一致,请重新输入"
	},
	"uid": {
		"min": "字段最小值为1"
	}
}
{
	"name": {
		"length": "用户名称长度非法"
	},
	"password2": {
		"password3": "名称不能为空",
		"same": "字段值不合法"
	},
	"uid": {
		"min": "字段最小值为6"
	}
}

示例3,属性递归校验

gvalid.CheckStruct支持递归校验,即如果属性也是结构体,并且结构体的属性带有gvalid标签,无论多深的递归层级,这些属性都将被根据设定的规则进行校验。

...

{
	"password1": {
		"same": "您两次输入的密码不一致"
	},
	"password2": {
		"same": "您两次输入的密码不一致"
	}
}

可选校验规则

当给定的数据校验规则中不包含required*规则时,表示该规则不是一个必须规则,当属性值为nil或者空字符串时,将会忽略其校验。

示例1,空字符串

type Params struct {
	Page      int    `v:"required|min:1         # page is required"`
	Size      int    `v:"required|between:1,100 # size is required"`
	ProjectId string `v:"between:1,10000        # project id must between :min, :max"`
}
obj := &Params{
	Page: 1,
	Size: 10,
}
err := gvalid.CheckStruct(obj, nil)
fmt.Println(err)
// Output:
// <nil>

示例2,空指针属性

type Params struct {
	Page      int       `v:"required|min:1         # page is required"`
	Size      int       `v:"required|between:1,100 # size is required"`
	ProjectId *gvar.Var `v:"between:1,10000        # project id must between :min, :max"`
}
obj := &Params{
	Page: 1,
	Size: 10,
}
err := gvalid.CheckStruct(obj, nil)
fmt.Println(err)
// Output:
// <nil>

示例3,空整型属性

需要注意的是,如果键值为0或者false,将仍然会被校验。

...