自定义规则-完整数据校验

基本介绍

大家也许已经注意到,当我们给定一个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