大家也许已经注意到,当我们给定一个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
容器部署即使用docker化部署golang应用程序,这是在云服务时代最流行的部署方式,也是最推荐的部署方式。在以下我们的示例中...
GoFrameORM组件针对于struct内嵌结构提供了良好的支持,包括参数传递、结果处理。例如:type Base struct {Uidint `orm:...
对OpenTelemetry的概念有初步了解后,我们接着以Jaeger为例来演示如何在程序中使用实现链路追踪。JaegerJaeger是Uber开...
普通数组package mainimport ("fmt""github.com/gogf/gf/v2/container/garray")func main () {// 创建并发安全的int类型数组a :=...
通常,删除方法被命名为 delete()。该方法立刻删除对象,并返回被删除的对象数量和一个包含了每个被删除对象类型的数量的字...
到目前为止,我们已经处理了被查询模型字段的聚合。然而,有时候想聚合的值属于你正在查询模型的关联模型。当在聚合函数中指定要...