Skip to main content
Version: 1.16.x

大家也许已经注意到,当我们给定一个 struct 时,我们的规则只能对其中的键值或者属性进行校验,如果我们想要通过规则完整校验 struct 这个对象时,居然无法注册校验组件的自定义校验规则。当然,没有是不可能的,我们的校验组件当然也支持直接校验当前的 struct 对象。

我们来看一个例子,在这个例子中,我们需要对创建的用户请求进行完整的自定义校验,并注册一个 UserCreateReq 的校验规则来实现。

package main

import (
"context"
"fmt"
"github.com/gogf/gf/errors/gerror"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/util/gmeta"
)

type UserCreateReq struct {
gmeta.Meta `v:"UserCreateReq"`
Name string
Pass string
}

func UserCreateReqChecker(ctx context.Context, rule string, value interface{}, message string, data interface{}) error {
user := &UserCreateReq{}
if v, ok := data.(*UserCreateReq); ok {
user = v
}
// SELECT COUNT(*) FROM `user` WHERE `name` = xxx
count, err := g.Model("user").Ctx(ctx).Where("name", user.Name).Count()
if err != nil {
return err
}
if count > 0 {
return gerror.Newf(`The name "%s" is already token`, user.Name)
}
return nil
}

func main() {
user := &UserCreateReq{
Name: "john",
Pass: "123456",
}
err := g.Validator().RuleFunc("UserCreateReq", UserCreateReqChecker).CheckStruct(user)
fmt.Println(err)
}

可以看到,我们通过给结构体一个 gmeta.Meta 嵌入的元数据,并绑定 UserCreateReq 的自定义规则, gmeta.Meta 作为结构体的一部分,当我们通过 CheckStruct 校验该结构体对象时,便可以通过 UserCreateReq 来实现校验。

上面的例子,我们执行后,终端输出:

The name "john" is already token