创新互联GoFrame教程:GoFrame自定义规则-完整数据校验

基本介绍

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

创新互联建站是专业的修武网站建设公司,修武接单;提供网站制作、成都网站设计,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行修武网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

使用示例

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

文章名称:创新互联GoFrame教程:GoFrame自定义规则-完整数据校验
文章源于:http://www.csdahua.cn/qtweb/news14/131414.html

网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网