7

go-playground/validator/v10 自定义错误内容

 2 years ago
source link: https://segmentfault.com/a/1190000041128917
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

go-playground/validator/v10 自定义错误内容

发布于 2 分钟前

当我们引用了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
    })

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK