Skip to main content
Version: 2.3.x

校验对象

数据校验组件提供了数据校验对象,用于数据校验的统一的配置管理、便捷的链式操作。

接口文档https://pkg.go.dev/github.com/gogf/gf/v2/util/gvalid

type Validator
func New() *Validator
func (v *Validator) Assoc(assoc interface{}) *Validator
func (v *Validator) Bail() *Validator
func (v *Validator) Ci() *Validator
func (v *Validator) Clone() *Validator
func (v *Validator) Data(data interface{}) *Validator
func (v *Validator) I18n(i18nManager *gi18n.Manager) *Validator
func (v *Validator) Messages(messages interface{}) *Validator
func (v *Validator) RuleFunc(rule string, f RuleFunc) *Validator
func (v *Validator) RuleFuncMap(m map[string]RuleFunc) *Validator
func (v *Validator) Rules(rules interface{}) *Validator
func (v *Validator) Run(ctx context.Context) Error

简要说明:

  1. New 方法用于创建一个新的校验对象。
  2. Assoc 用于关联数据校验,具体请查看后续章节介绍。
  3. Bail 方法用于设定只要后续的多个校验中有一个规则校验失败则停止校验立即返回错误结果。
  4. Ci 方法用于设置需要比较数值的规则时,不区分字段的大小写。
  5. Run 方法对给定规则和信息的数据进行校验操作。
  6. I18n 方法用于设置当前校验对象的 I18N 国际化组件。默认情况下,校验组件使用的是框架全局默认的 i18n 组件对象。
  7. Data 方法用于传递需要联合校验的数据集合,往往传递的是 map 类型或者 struct 类型。
  8. Rules 方法用于传递当前链式操作校验的自定义校验规则,往往使用 []string 类型或者 map 类型。
  9. Messages 方法用于传递当前链式操作校验的自定义错误提示信息,往往使用 map 类型传递,具体看后续代码示例。

由于数据校验对象也是一个非常常用的对象,因此 g 模块中定义了 Validator 方法来快捷创建校验对象。大部分场景下我们推荐使用 g 模块的 g.Validator() 方式来快捷创建一个校验对象,关于 g 模块的介绍请参考章节: 对象管理

使用示例

单数据校验

var (
err error
ctx = gctx.New()
)
err = g.Validator().
Rules("min:18").
Data(16).
Messages("未成年人不允许注册哟").
Run(ctx)
fmt.Println(err.Error())

// Output:
// 未成年人不允许注册哟
var (
err error
ctx = gctx.New()
data = g.Map{
"password": "123",
}
)

err = g.Validator().Data("").Assoc(data).
Rules("required-with:password").
Messages("请输入确认密码").
Run(ctx)

fmt.Println(err.Error())

Struct 数据校验

type User struct {
Name string `v:"required#请输入用户姓名"`
Type int `v:"required#请选择用户类型"`
}
var (
err error
ctx = gctx.New()
user = User{}
data = g.Map{
"name": "john",
}
)
if err = gconv.Scan(data, &user); err != nil {
panic(err)
}
err = g.Validator().Assoc(data).Data(user).Run(ctx)
if err != nil {
fmt.Println(err.(gvalid.Error).Items())
}

// Output:
// [map[Type:map[required:请选择用户类型]]]

Map 数据校验

params := map[string]interface{}{
"passport": "",
"password": "123456",
"password2": "1234567",
}
rules := map[string]string{
"passport": "required|length:6,16",
"password": "required|length:6,16|same:password2",
"password2": "required|length:6,16",
}
messages := map[string]interface{}{
"passport": "账号不能为空|账号长度应当在{min}到{max}之间",
"password": map[string]string{
"required": "密码不能为空",
"same": "两次密码输入不相等",
},
}
err := g.Validator().Messages(messages).Rules(rules).Data(params).Run(gctx.New())
if err != nil {
g.Dump(err.Maps())
}

执行后,终端输出:

{
"passport": {
"length": "账号长度应当在6到16之间",
"required": "账号不能为空"
},
"password": {
"same": "两次密码输入不相等"
}
}