首頁 > 軟體

GoFrame框架資料校驗之校驗物件校驗結構體

2022-06-20 22:00:13

前言摘要

這篇文章將會為大家介紹GoFrame資料校驗中校驗物件的知識點,包括:Validator物件常用方法的介紹、單資料校驗、校驗Map、校驗結構體的範例。

基本概念

資料校驗元件提供了資料校驗物件:用於資料校驗統一的設定管理,支援我們便捷的進行鏈式操作。

方法介紹

type Validator
    func New() *Validator
    func (v *Validator) CheckMap(params interface{}) Error
    func (v *Validator) CheckStruct(object interface{}) Error
    func (v *Validator) CheckValue(value interface{}) Error
    func (v *Validator) Clone() *Validator
    func (v *Validator) Ctx(ctx context.Context) *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) Rules(rules interface{}) *Validator

簡要說明

  • New()方法用於建立一個新的校驗物件。
  • CheckValue/CheckMap/CheckStruct方法用於特定引數型別的資料校驗,我們在專案開發中使用比較多的是CheckStruct,也建議大家使用CheckStruct。
  • Ctx()方法用於傳遞Context上下文變數。
  • I18n()方法用於設定當前校驗物件的I18N國際化元件,預設情況下,校驗元件使用的是框架全域性預設的i18n元件物件。
  • Data()方法用於設定需要校驗的資料集合,支援map型別或者struct型別。
  • Rules()方法用於傳遞當前鏈式操作校驗的自定義校驗規則,支援使用[]string型別或者map型別。
  • Messages()方法用於傳遞當前鏈式操作校驗的自定義錯誤提示資訊,往往使用map型別傳遞,具體看後續程式碼範例。

注意問題TIPS

在資料校驗物件的CheckValue/CheckMap/CheckStruct方法中,不存在Context上下文變數引數,而是通過鏈式操作的Ctx方法來控制。

GoFrame的g模組中定義了Validator方法來快捷建立校驗物件:官方也推薦我們使用g模組的g.Validator()方式來快捷建立一個校驗物件。

鏈式操作

範例1:單資料校驗

簡單範例

err := g.Validator().Rules("min:60").Messages("考試不及格").CheckValue(16)
    fmt.Println(err.String()) //列印結果:考試不及格

進階範例

package main
import (
   "fmt"
   "github.com/gogf/gf/frame/g"
)
func main() {
   data := g.Map{
      "password": "123", //這個的作用僅是定義了這個結構設定了預設值,並不代表著傳入了值
   }
   //Data()中的引數是需要進行校驗的資料集合,常用於map或者結構體型別。
   //CheckValue()是輸入的引數
   err := g.Validator().Data(data).Rules("required-with:password").Messages("請輸入確認密碼").CheckValue("")
   if err != nil {
      fmt.Println("CheckValue傳入為空時:" + err.String()) // 請輸入確認密碼
   } else {
      fmt.Println("CheckValue傳入為空時:校驗通過")
   }
   err = g.Validator().Data(data).Rules("required-with:password").Messages("請輸入確認密碼").CheckValue("1")
   if err != nil {
      fmt.Println("CheckValue傳入不為空時:" + err.String()) // 請輸入確認密碼
   } else {
      fmt.Println("CheckValue傳入不為空時:校驗通過")
   }
}

進階範例列印結果

範例2:Map資料校驗

params := map[string]interface{}{
	"passport":  "",
	"password":  "wangzhongyang",
	"password2": "zhongyang",
}
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": "賬號不能為空|賬號長度應當在:min到:max之間",
	"password": map[string]string{
		"required": "密碼不能為空",
		"same":     "兩次密碼輸入不相等",
	},
}
err := g.Validator().Messages(messages).Rules(rules).CheckMap(params)
if err != nil {
	g.Dump(err.Maps())
}

執行後,終端輸出:

{
    "passport": {
        "length": "賬號長度應當在6到16之間",
        "required": "賬號不能為空"
    },
    "password": {
        "same": "兩次密碼輸入不相等"
    }
}

範例3:Struct資料校驗

type User struct {
	Name string `v:"required#請輸入使用者姓名"`
	Type int    `v:"required#請選擇使用者型別"`
}
data := g.Map{
	"name": "wangzhongyang",
}
user := User{}
if err := gconv.Scan(data, &user); err != nil {
	panic(err)
}
err := g.Validator().Data(data).CheckStruct(user)
if err != nil {
	fmt.Println(err.Items()) //[map[Type:map[required:請選擇使用者型別]]]
}

總結

這篇文章為大家介紹了GoFrame資料校驗之校驗物件的知識點,包括:Validator物件常用方法的介紹、單資料校驗、校驗Map、校驗結構體的範例。

更多關於GoFrame校驗結構體的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com