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

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

    1. package main
    2. import (
    3. "context"
    4. "fmt"
    5. "github.com/gogf/gf/errors/gerror"
    6. "github.com/gogf/gf/frame/g"
    7. "github.com/gogf/gf/util/gmeta"
    8. )
    9. type UserCreateReq struct {
    10. gmeta.Meta `v:"UserCreateReq"`
    11. Name string
    12. Pass string
    13. }
    14. func UserCreateReqChecker(ctx context.Context, rule string, value interface{}, message string, data interface{}) error {
    15. user := &UserCreateReq{}
    16. if v, ok := data.(*UserCreateReq); ok {
    17. user = v
    18. }
    19. // SELECT COUNT(*) FROM `user` WHERE `name` = xxx
    20. count, err := g.Model("user").Ctx(ctx).Where("name", user.Name).Count()
    21. if err != nil {
    22. return err
    23. }
    24. if count > 0 {
    25. return gerror.Newf(`The name "%s" is already token`, user.Name)
    26. }
    27. return nil
    28. }
    29. func main() {
    30. user := &UserCreateReq{
    31. Name: "john",
    32. Pass: "123456",
    33. }
    34. err := g.Validator().RuleFunc("UserCreateReq", UserCreateReqChecker).CheckStruct(user)
    35. fmt.Println(err)
    36. }

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

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

    1. The name "john" is already token