GoFrame Struct校驗(yàn)-基本使用

2022-03-30 13:49 更新

?Struct?校驗(yàn)常使用以下鏈?zhǔn)讲僮鞣绞剑?/p>

g.Validator().Data(object).Run(ctx)

gvalid tag規(guī)則介紹

在開始介紹?Struct?參數(shù)類型校驗(yàn)之前,我們來介紹一下常用的?gvalid tag?規(guī)則。規(guī)則如下:

[屬性別名@]校驗(yàn)規(guī)則[#錯誤提示]

其中:

  • 屬性別名 和 錯誤提示 為非必需字段,校驗(yàn)規(guī)則 是必需字段。
  • 屬性別名 非必需字段,指定在校驗(yàn)中使用的對應(yīng)?struct?屬性的別名,同時校驗(yàn)后返回的?error?對象中的也將使用該別名返回。例如在處理請求表單時比較有用,因?yàn)楸韱蔚淖侄蚊Q往往和?struct?的屬性名稱不一致。大部分場景下不需要設(shè)置屬性別名,默認(rèn)直接使用屬性名稱即可。
  • 校驗(yàn)規(guī)則則為當(dāng)前屬性的校驗(yàn)規(guī)則,多個校驗(yàn)規(guī)則請使用|符號組合,例如:?required|between:1,100?。
  • 錯誤提示 非必需字段,表示自定義的錯誤提示信息,當(dāng)規(guī)則校驗(yàn)時對默認(rèn)的錯誤提示信息進(jìn)行覆蓋。

gvalid tag使用示例

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": "密碼格式不合法",
        },
    },
]

使用map指定校驗(yàn)規(guī)則

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)體校驗(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": "您兩次輸入的密碼不一致",
    },
}


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號