GoFrame 自定義規(guī)則-完整數(shù)據(jù)校驗(yàn)

2022-03-30 14:15 更新

基本介紹

大家也許已經(jīng)注意到,當(dāng)我們給定一個(gè)?struct?時(shí),我們的規(guī)則只能對(duì)其中的鍵值或者屬性進(jìn)行校驗(yàn),如果我們想要通過規(guī)則完整校驗(yàn)?struct?這個(gè)對(duì)象時(shí),居然無法注冊(cè)校驗(yàn)組件的自定義校驗(yàn)規(guī)則。當(dāng)然,我們的校驗(yàn)組件也支持直接校驗(yàn)當(dāng)前的?struct?對(duì)象。我們來看一個(gè)例子,在這個(gè)例子中,我們需要對(duì)創(chuàng)建的用戶請(qǐng)求進(jìn)行完整的自定義校驗(yàn),并注冊(cè)一個(gè)?UserCreateReq?的校驗(yàn)規(guī)則來實(shí)現(xiàn)。

使用示例

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)
}

可以看到,我們通過給結(jié)構(gòu)體一個(gè)?g.Meta?嵌入的元數(shù)據(jù),并綁定?UserCreateReq?的自定義規(guī)則,?g.Meta?作為結(jié)構(gòu)體的一部分,當(dāng)我們通過?CheckStruct?校驗(yàn)該結(jié)構(gòu)體對(duì)象時(shí),便可以通過?UserCreateReq?來實(shí)現(xiàn)校驗(yàn)。

上面的例子,我們執(zhí)行后,終端輸出:

The name "john" is already token


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)