Categories: GoFrame 教程

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

基本介绍

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

terry

这个人很懒,什么都没有留下~

Share
Published by
terry

Recent Posts

聊聊vue3中的defineProps

在Vue 3中,defineP…

1 周 ago

在 Chrome 中删除、允许和管理 Cookie

您可以选择删除现有 Cooki…

2 周 ago

自定义指令:聊聊vue中的自定义指令应用法则

今天我们来聊聊vue中的自定义…

3 周 ago

聊聊Vue中@click.stop和@click.prevent

一起来学下聊聊Vue中@cli…

4 周 ago

Nginx 基本操作:启动、停止、重启命令。

我们来学习Nginx基础操作:…

1 月 ago

Vue3:手动清理keep-alive组件缓存的方法

Vue3中手动清理keep-a…

1 月 ago