W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
大家也許已經(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
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: