当咱们援用了 go-playground/validator/v10 库并且配置了如下内容并配置了中文:
Name string `json:"name" validate:"required"
那么他的返回信息如下:
Name 为必填字段
仍然不是很敌对,这个时候咱们就须要自定义谬误内容:
名称为必填字段
代码如下:
package utils
import (
CN_ZH "github.com/go-playground/locales/zh"
ut "github.com/go-playground/universal-translator"
"github.com/go-playground/validator/v10"
zhTranslations "github.com/go-playground/validator/v10/translations/zh"
"reflect"
)
var Validate *validator.Validate
// Validate/v10 全局验证器
var trans ut.Translator
// 初始化 Validate/v10 国际化
func init() {zh := CN_ZH.New()
uni := ut.New(zh, zh)
trans, _ = uni.GetTranslator("zh")
Validate = validator.New()
// 通过 label 标签返回自定义谬误内容
Validate.RegisterTagNameFunc(func(field reflect.StructField) string {label := field.Tag.Get("label")
if label == "" {return field.Name}
return label
})
zhTranslations.RegisterDefaultTranslations(Validate, trans)
// 自定义 required_if 谬误内容
Validate.RegisterTranslation("required_if", trans, func(ut ut.Translator) error {return ut.Add("required_if", "{0} 为必填字段!", false) // see universal-translator for details
}, func(ut ut.Translator, fe validator.FieldError) string {t, _ := ut.T("required_if", fe.Field())
return t
})
}
// 测验并返回测验错误信息
func Translate(err error) (errMsg string) {errs := err.(validator.ValidationErrors)
for _, err := range errs {errMsg = err.Translate(trans)
}
return
}
struct 配置如下:
Name string `json:"name" validate:"required" label:"路由 name"`
此时返回的内容为:
路由 name 为必填字段
测验代码如下:
var menu model.SysMenu
_ = c.ShouldBindJSON(&menu)
if err := utils.Validate.Struct(menu); err != nil {response.FailWithMessage(utils.Translate(err), c)
return
}
坑点:
当我想应用 required_if 进行判断时候,发现 v10 库没有加上 required_if 这个标签,那么你须要自定义:
// 自定义 required_if 谬误内容
Validate.RegisterTranslation("required_if", trans, func(ut ut.Translator) error {return ut.Add("required_if", "{0} 为必填字段!", false) // see universal-translator for details
}, func(ut ut.Translator, fe validator.FieldError) string {t, _ := ut.T("required_if", fe.Field())
return t
})