GoFrame 數(shù)據(jù)校驗-校驗結(jié)果

2022-03-30 14:30 更新

基本介紹

校驗結(jié)果為一個?error?錯誤對象,內(nèi)部使用?gvalid.Error?對象實現(xiàn)。當(dāng)數(shù)據(jù)規(guī)則校驗成功時,校驗方法返回的結(jié)果為?nil?。當(dāng)數(shù)據(jù)規(guī)則校驗失敗時,返回的該對象是包含結(jié)構(gòu)化的層級?map?,包含多個字段及其規(guī)則及對應(yīng)錯誤信息,以便于接收端能夠準(zhǔn)確定位錯誤規(guī)則。相關(guān)數(shù)據(jù)結(jié)構(gòu)及方法如下:https://pkg.go.dev/github.com/gogf/gf/v2/util/gvalid

type Error interface {
	Code() gcode.Code
	Current() error
	Error() string
	FirstItem() (key string, messages map[string]error)
	FirstRule() (rule string, err error)
	FirstError() (err error)
	Items() (items []map[string]map[string]error)
	Map() map[string]error
	Maps() map[string]map[string]error
	String() string
	Strings() (errs []string)
}

可以結(jié)合后續(xù)的示例理解這個數(shù)據(jù)結(jié)構(gòu)。我們可以通過?Maps()?方法獲得該原始錯誤信息數(shù)據(jù)結(jié)構(gòu)?map?。但在大多數(shù)時候我們可以通過?Error?接口的其他方法來方便地獲取特定的錯誤信息。

大多數(shù)情況下,我們不關(guān)心具體出錯的校驗規(guī)則,可以使用?Error/String?方法直接返回所有的錯誤信息即可。大部分的方法獲取錯誤信息時根據(jù)校驗規(guī)則的順序性與否,返回的結(jié)果順序會不太一樣。

簡要說明:

獲取校驗結(jié)果的值可以通過多個校驗結(jié)果方法獲取,為讓各位開發(fā)者有充分的理解,詳細(xì)說明以下:

 方法  說明
 ?Code?  常用方法。實現(xiàn)?gerror?的?Code?接口,在校驗組件中,該方法固定返回錯誤碼?gcode.CodeValidationFailed?
 ?Error?  常用方法。實現(xiàn)標(biāo)準(zhǔn)庫的?error.Error?接口,獲取返回所有校驗錯誤組成的錯誤字符串。內(nèi)部邏輯同?String?方法
 ?Current?  常用方法。實現(xiàn)了?gerror?的?Current?接口,用于獲取校驗錯誤中的第一條錯誤對象
 ?Items?  在順序性校驗中將會按照校驗規(guī)則順序返回校驗錯誤數(shù)組。其順序性只有在順序校驗時有效,否則返回的結(jié)果是隨機的
 ?Map?  返回?FirstItem?中的出錯自規(guī)則及對應(yīng)錯誤信息?map?
 ?Maps?  返回所有的出錯鍵名及對應(yīng)的出錯規(guī)則及對應(yīng)的錯誤信息(?map[string]map[string]error?
 ?String?  返回所有的錯誤信息,構(gòu)成一條字符串返回,多個規(guī)則錯誤信息之間以?;?符號連接。其順序性只有使用順序校驗規(guī)則時有效,否則返回的結(jié)果是隨機的
 ?Strings?  返回所有的錯誤信息,構(gòu)成?[]string?類型返回。其順序性只有使用順序校驗規(guī)則時有效,否則返回的結(jié)果是隨機的
 ?FirstItem?  在有多個鍵名/屬性校驗錯誤的時候,用以獲取出錯的第一個鍵名,以及其對應(yīng)的出錯規(guī)則和錯誤信息。其順序性只有使用順序校驗規(guī)則時有效,否則返回的結(jié)果是隨機的
 ?FirstRule?  返回FirstItem中的第一條出錯的規(guī)則及錯誤信息。其順序性只有使用順序校驗規(guī)則時有效,否則返回的結(jié)果是隨機的
 ?FirstString?  返回FirstRule中的第一條規(guī)則錯誤信息。其順序性只有使用順序校驗規(guī)則時有效,否則返回的結(jié)果是隨機的

gerror.Current支持

我們可以看到,?gvalid.Error?實現(xiàn)了?Current() error?接口,因此可以通過?gerror.Current?方法獲取它的第一條錯誤信息,這在接口校驗失敗時返回錯誤信息非常方便。我們來看一個示例:

package main

import (
	"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"
)

func main() {
	type User struct {
		Name string `v:"required#請輸入用戶姓名"`
		Type int    `v:"required|min:1#|請選擇用戶類型"`
	}
	var (
		err  error
		ctx  = gctx.New()
		user = User{}
	)
	if err = g.Validator().Data(user).Run(ctx); err != nil {
		g.Dump(err.(gvalid.Error).Maps())
		g.Dump(gerror.Current(err))
	}
}

這里使用了?gerror.Current(err)?來獲取校第一條驗錯誤信息。執(zhí)行后,終端輸出:

{
    "Name": {
        "required": "請輸入用戶姓名",
    },
    "Type": {
        "min": "請選擇用戶類型",
    },
}
"請輸入用戶姓名"

需要注意的是,數(shù)據(jù)校驗時存在順序性校驗和非順序性校驗,這會對獲取第一條錯誤信息的結(jié)果產(chǎn)生影響。


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號