大家也许已经注意到,当我们给定一个struct
时,我们的规则只能对其中的键值或者属性进行校验,如果我们想要通过规则完整校验struct
这个对象时,居然无法注册校验组件的自定义校验规则。当然,我们的校验组件也支持直接校验当前的struct
对象。我们来看一个例子,在这个例子中,我们需要对创建的用户请求进行完整的自定义校验,并注册一个UserCreateReq
的校验规则来实现。
package main import ( "context" "fmt" "github.com/gogf/gf/v2/database/gdb" "github.com/gogf/gf/v2/errors/gerror" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/os/gctx" "github.com/gogf/gf/v2/util/gvalid" "time" ) type UserCreateReq struct { g.Meta `v:"UserCreateReq"` Name string Pass string } func RuleUserCreateReq(ctx context.Context, in gvalid.RuleFuncInput) error { var req *UserCreateReq if err := in.Data.Scan(&req); err != nil { return gerror.Wrap(err, `Scan data to UserCreateReq failed`) } // SELECT COUNT(*) FROM `user` WHERE `name` = xxx count, err := g.Model("user").Ctx(ctx).Cache(gdb.CacheOption{ Duration: time.Hour, Name: "", Force: false, }).Where("name", req.Name).Count() if err != nil { return err } if count > 0 { return gerror.Newf(`The name "%s" is already token by others`, req.Name) } return nil } func main() { var ( ctx = gctx.New() user = &UserCreateReq{ Name: "john", Pass: "123456", } ) err := g.Validator().RuleFunc("UserCreateReq", RuleUserCreateReq).Data(user).Run(ctx) fmt.Println(err) } |
可以看到,我们通过给结构体一个g.Meta
嵌入的元数据,并绑定UserCreateReq
的自定义规则,g.Meta
作为结构体的一部分,当我们通过CheckStruct
校验该结构体对象时,便可以通过UserCreateReq
来实现校验。
上面的例子,我们执行后,终端输出:
The name "john" is already token |