基本介绍

大家也许已经注意到,当我们给定一个 struct 时,我们的规则只能对其中的键值或者属性进行校验,如果我们想要通过规则完整校验 struct 这个对象时,居然无法注册校验组件的自定义校验规则。当然,我们的校验组件也支持直接校验当前的 struct 对象。我们来看一个例子,在这个例子中,我们需要对创建的用户请求进行完整的自定义校验,并注册一个 UserCreateReq 的校验规则来实现。

使用示例

  1. package main
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/gogf/gf/v2/database/gdb"
  6. "github.com/gogf/gf/v2/errors/gerror"
  7. "github.com/gogf/gf/v2/frame/g"
  8. "github.com/gogf/gf/v2/os/gctx"
  9. "github.com/gogf/gf/v2/util/gvalid"
  10. "time"
  11. )
  12. type UserCreateReq struct {
  13. g.Meta `v:"UserCreateReq"`
  14. Name string
  15. Pass string
  16. }
  17. func RuleUserCreateReq(ctx context.Context, in gvalid.RuleFuncInput) error {
  18. var req *UserCreateReq
  19. if err := in.Data.Scan(&req); err != nil {
  20. return gerror.Wrap(err, `Scan data to UserCreateReq failed`)
  21. }
  22. // SELECT COUNT(*) FROM `user` WHERE `name` = xxx
  23. count, err := g.Model("user").Ctx(ctx).Cache(gdb.CacheOption{
  24. Duration: time.Hour,
  25. Name: "",
  26. Force: false,
  27. }).Where("name", req.Name).Count()
  28. if err != nil {
  29. return err
  30. }
  31. if count > 0 {
  32. return gerror.Newf(`The name "%s" is already token by others`, req.Name)
  33. }
  34. return nil
  35. }
  36. func main() {
  37. var (
  38. ctx = gctx.New()
  39. user = &UserCreateReq{
  40. Name: "john",
  41. Pass: "123456",
  42. }
  43. )
  44. err := g.Validator().RuleFunc("UserCreateReq", RuleUserCreateReq).Data(user).Run(ctx)
  45. fmt.Println(err)
  46. }

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

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

  1. The name "john" is already token