W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎勵
?Struct
?校驗(yàn)常使用以下鏈?zhǔn)讲僮鞣绞剑?/p>
g.Validator().Data(object).Run(ctx)
在開始介紹?Struct
?參數(shù)類型校驗(yàn)之前,我們來介紹一下常用的?gvalid tag
?規(guī)則。規(guī)則如下:
[屬性別名@]校驗(yàn)規(guī)則[#錯誤提示]
其中:
struct
?屬性的別名,同時校驗(yàn)后返回的?error
?對象中的也將使用該別名返回。例如在處理請求表單時比較有用,因?yàn)楸韱蔚淖侄蚊Q往往和?struct
?的屬性名稱不一致。大部分場景下不需要設(shè)置屬性別名,默認(rèn)直接使用屬性名稱即可。
required|between:1,100
?。
package main
import (
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gctx"
)
type User struct {
Uid int `v:"uid @integer|min:1#|請輸入用戶ID"`
Name string `v:"name @required|length:6,30#請輸入用戶名稱|用戶名稱長度非法"`
Pass1 string `v:"password1@required|password3"`
Pass2 string `v:"password2@required|password3|same:Pass1#|密碼格式不合法|兩次密碼不一致,請重新輸入"`
}
func main() {
var (
ctx = gctx.New()
user = &User{
Name: "john",
Pass1: "Abc123!@#",
Pass2: "123",
}
)
err := g.Validator().Data(user).Run(ctx)
if err != nil {
g.Dump(err.Items())
}
}
可以看到,我們可以對在?struct
?定義時使用了?gvalid
?的?gvalid tag
?來綁定校驗(yàn)的規(guī)則及錯誤提示信息。在此示例代碼中,?same:password1
?規(guī)則同使用?same:Pass1
?規(guī)則是一樣的效果。也就是說,在數(shù)據(jù)校驗(yàn)中,可以同時使用原有的?struct
?屬性名稱,也可以使用別名。但是,返回的結(jié)果中只會使用別名返回,這也是別名最大的用途。此外,在對?struct
?對象進(jìn)行校驗(yàn)時,也可以傳遞校驗(yàn)或者和錯誤提示參數(shù),這個時候會覆蓋?struct
?在定義時綁定的對應(yīng)參數(shù)。
以上示例執(zhí)行后,輸出結(jié)果為:
[
{
"uid": {
"min": "請輸入用戶ID",
},
},
{
"name": {
"length": "用戶名稱長度非法",
},
},
{
"password2": {
"password3": "密碼格式不合法",
},
},
]
package main
import (
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gctx"
)
func main() {
type User struct {
Age int
Name string
}
var (
ctx = gctx.New()
user = User{Name: "john"}
rules = map[string]string{
"Name": "required|length:6,16",
"Age": "between:18,30",
}
messages = map[string]interface{}{
"Name": map[string]string{
"required": "名稱不能為空",
"length": "名稱長度為{min}到{max}個字符",
},
"Age": "年齡為18到30周歲",
}
)
err := g.Validator().Rules(rules).Messages(messages).Data(user).Run(ctx)
if err != nil {
g.Dump(err.Maps())
}
}
在以上示例中,?Age
?屬性由于默認(rèn)值?0
?的存在,因此會引起?required
?規(guī)則的失效,因此這里沒有使用?required
?規(guī)則而是使用?between
?規(guī)則來進(jìn)行校驗(yàn)。示例代碼執(zhí)行后,終端輸出:
{
"Age": {
"between": "年齡為18到30周歲"
},
"Name": {
"length": "名稱長度為6到16個字符"
}
}
支持遞歸的結(jié)構(gòu)體校驗(yàn),即如果屬性也是結(jié)構(gòu)體(也支持嵌套結(jié)構(gòu)體(?embedded
?)),那么將會自動將該屬性執(zhí)行遞歸校驗(yàn)。使用示例:
package main
import (
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gctx"
)
func main() {
type Pass struct {
Pass1 string `valid:"password1@required|same:password2#請輸入您的密碼|您兩次輸入的密碼不一致"`
Pass2 string `valid:"password2@required|same:password1#請?jiān)俅屋斎肽拿艽a|您兩次輸入的密碼不一致"`
}
type User struct {
Pass
Id int
Name string `valid:"name@required#請輸入您的姓名"`
}
var (
ctx = gctx.New()
user = &User{
Name: "john",
Pass: Pass{
Pass1: "1",
Pass2: "2",
},
}
)
err := g.Validator().Data(user).Run(ctx)
g.Dump(err.Maps())
}
或者屬性為嵌套結(jié)構(gòu)體(?embedded
?)的場景:
package main
import (
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gctx"
)
func main() {
type Pass struct {
Pass1 string `valid:"password1@required|same:password2#請輸入您的密碼|您兩次輸入的密碼不一致"`
Pass2 string `valid:"password2@required|same:password1#請?jiān)俅屋斎肽拿艽a|您兩次輸入的密碼不一致"`
}
type User struct {
Id int
Name string `valid:"name@required#請輸入您的姓名"`
Pass Pass
}
var (
ctx = gctx.New()
user = &User{
Name: "john",
Pass: Pass{
Pass1: "1",
Pass2: "2",
},
}
)
err := g.Validator().Data(user).Run(ctx)
g.Dump(err.Maps())
}
執(zhí)行后,終端輸出:
{
"password1": {
"same": "您兩次輸入的密碼不一致",
},
"password2": {
"same": "您兩次輸入的密碼不一致",
},
}
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: