GoFrame 數(shù)據(jù)校驗(yàn)-校驗(yàn)對(duì)象

2022-03-30 11:47 更新

校驗(yàn)對(duì)象

數(shù)據(jù)校驗(yàn)組件提供了數(shù)據(jù)校驗(yàn)對(duì)象,用于數(shù)據(jù)校驗(yàn)的統(tǒng)一的配置管理、便捷的鏈?zhǔn)讲僮鳌?

接口文檔: https://pkg.go.dev/github.com/gogf/gf/v2/util/gvalid

type Validator 
    func New() *Validator
    func (v *Validator) Assoc(assoc interface{}) *Validator
    func (v *Validator) Bail() *Validator
    func (v *Validator) Ci() *Validator
    func (v *Validator) Clone() *Validator
    func (v *Validator) Data(data interface{}) *Validator
    func (v *Validator) I18n(i18nManager *gi18n.Manager) *Validator
    func (v *Validator) Messages(messages interface{}) *Validator
    func (v *Validator) RuleFunc(rule string, f RuleFunc) *Validator
    func (v *Validator) RuleFuncMap(m map[string]RuleFunc) *Validator
    func (v *Validator) Rules(rules interface{}) *Validator
    func (v *Validator) Run(ctx context.Context) Error

簡(jiǎn)要說(shuō)明:

  1. ?New?方法用于創(chuàng)建一個(gè)新的校驗(yàn)對(duì)象。
  2. ?Assoc?用于關(guān)聯(lián)數(shù)據(jù)校驗(yàn)。
  3. ?Bail?方法用于設(shè)定只要后續(xù)的多個(gè)校驗(yàn)中有一個(gè)規(guī)則校驗(yàn)失敗則停止校驗(yàn)立即返回錯(cuò)誤結(jié)果。
  4. ?Ci?方法用于設(shè)置需要比較數(shù)值的規(guī)則時(shí),不區(qū)分字段的大小寫。
  5. ?Run?方法對(duì)給定規(guī)則和信息的數(shù)據(jù)進(jìn)行校驗(yàn)操作。
  6. ?I18n?方法用于設(shè)置當(dāng)前校驗(yàn)對(duì)象的?I18N?國(guó)際化組件。默認(rèn)情況下,校驗(yàn)組件使用的是框架全局默認(rèn)的?i18n?組件對(duì)象。
  7. ?Data?方法用于傳遞需要聯(lián)合校驗(yàn)的數(shù)據(jù)集合,往往傳遞的是?map?類型或者?struct?類型。
  8. ?Rules?方法用于傳遞當(dāng)前鏈?zhǔn)讲僮餍r?yàn)的自定義校驗(yàn)規(guī)則,往往使用?[]string?類型或者?map?類型。
  9. ?Messages?方法用于傳遞當(dāng)前鏈?zhǔn)讲僮餍r?yàn)的自定義錯(cuò)誤提示信息,往往使用?map?類型傳遞。

由于數(shù)據(jù)校驗(yàn)對(duì)象也是一個(gè)非常常用的對(duì)象,因此?g?模塊中定義了?Validator?方法來(lái)快捷創(chuàng)建校驗(yàn)對(duì)象。大部分場(chǎng)景下我們推薦使用?g?模塊的?g.Validator()?方式來(lái)快捷創(chuàng)建一個(gè)校驗(yàn)對(duì)象。

使用示例

單數(shù)據(jù)校驗(yàn)

var (
	err error
	ctx = gctx.New()
)
err = g.Validator().
	Rules("min:18").
	Data(16).
	Messages("未成年人不允許注冊(cè)喲").
	Run(ctx)
fmt.Println(err.Error())

// Output:
// 未成年人不允許注冊(cè)喲
var (
	err  error
	ctx  = gctx.New()
	data = g.Map{
		"password": "123",
	}
)

err = g.Validator().Data("").Assoc(data).
	Rules("required-with:password").
	Messages("請(qǐng)輸入確認(rèn)密碼").
	Run(ctx)

fmt.Println(err.Error())

Struct數(shù)據(jù)校驗(yàn)

type User struct {
	Name string `v:"required#請(qǐng)輸入用戶姓名"`
	Type int    `v:"required#請(qǐng)選擇用戶類型"`
}
var (
	err  error
	ctx  = gctx.New()
	user = User{}
	data = g.Map{
		"name": "john",
	}
)
if err = gconv.Scan(data, &user); err != nil {
	panic(err)
}
err = g.Validator().Assoc(data).Data(user).Run(ctx)
if err != nil {
	fmt.Println(err.(gvalid.Error).Items())
}

// Output:
// [map[Type:map[required:請(qǐng)選擇用戶類型]]]

Map數(shù)據(jù)校驗(yàn)

params := map[string]interface{}{
	"passport":  "",
	"password":  "123456",
	"password2": "1234567",
}
rules := map[string]string{
	"passport":  "required|length:6,16",
	"password":  "required|length:6,16|same:password2",
	"password2": "required|length:6,16",
}
messages := map[string]interface{}{
	"passport": "賬號(hào)不能為空|賬號(hào)長(zhǎng)度應(yīng)當(dāng)在{min}到{max}之間",
	"password": map[string]string{
		"required": "密碼不能為空",
		"same":     "兩次密碼輸入不相等",
	},
}
err := g.Validator().Messages(messages).Rules(rules).Data(params).Run(gctx.New())
if err != nil {
	g.Dump(err.Maps())
}

執(zhí)行后,終端輸出:

{
    "passport": {
        "length": "賬號(hào)長(zhǎng)度應(yīng)當(dāng)在6到16之間",
        "required": "賬號(hào)不能為空"
    },
    "password": {
        "same": "兩次密碼輸入不相等"
    }
}


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

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)