gin验证表单时 怎么实现类似laravel表单验证的attribute替换?
当前实现的结果
{
code: 422,
errors: {
password: "password为必填字段",
username: "username为必填字段"
},
message: "The given data was invalid"
}
当前代码
func InitTrans(locale string) (err error) {
// 修改gin框架中的Validator引擎属性,实现自定制
if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
// 注册一个获取json tag的自定义方法
v.RegisterTagNameFunc(func(fld reflect.StructField) string {
//label := strings.SplitN(fld.Tag.Get("label"), ",", 2)[0]
//fmt.Println(label)
//if label != "" {
// return label
//}
name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
if name == "-" {
return ""
}
return name
})
zhT := zh.New() // 中文翻译器
enT := en.New() // 英文翻译器
// 第一个参数是备用(fallback)的语言环境
// 后面的参数是应该支持的语言环境(支持多个)
// uni := ut.New(zhT, zhT) 也是可以的
uni := ut.New(enT, zhT)
// locale 通常取决于 http 请求头的 'Accept-Language'
var ok bool
// 也可以使用 uni.FindTranslator(...) 传入多个locale进行查找
Trans, ok = uni.GetTranslator(locale)
if !ok {
return fmt.Errorf("uni.GetTranslator(%s) failed", locale)
}
// 注册翻译器
switch locale {
case "en":
err = enTranslations.RegisterDefaultTranslations(v, Trans)
case "zh":
fmt.Println("注册了中文翻译器")
err = zhTranslations.RegisterDefaultTranslations(v, Trans)
default:
err = enTranslations.RegisterDefaultTranslations(v, Trans)
}
return
}
return
}
func Abort(c *gin.Context) {
var req loginRequest
if err := c.ShouldBind(&req); err != nil {
// 获取validator.ValidationErrors 类型的errors
errs, ok := err.(validator.ValidationErrors)
if !ok {
// 非validator.ValidationErrors类型错误直接返回
c.JSON(http.StatusOK, gin.H{
"msg": err.Error(),
})
return
}
// validator.ValidationErrors 类型错误则进行翻译
c.JSON(http.StatusOK, gin.H{
"code": 422,
"message": "The given data was invalid",
"errors": lang.RemoveTopStruct(errs.Translate(lang.Trans)),
})
return
}
c.JSON(http.StatusOK, gin.H{
"code": 200,
})
}
我尝试在结构体中加一个label标签,替换tag,如上面注释的代码,但是发现字段名一起变了
{
code: 422,
errors: {
password: "password为必填字段",
用户名: "用户名为必填字段"
},
message: "The given data was invalid"
}
我只想把消息内容(laravel里的message里的attribute)里的username替换为用户名,不想替换前面的key,该怎么做?
laravel 的也是自定义报错的吧,go 的话是自己封装一次,像这种 github.com/deatil/lakego-admin/blo...
自定义一个Translate方法吧
这个好像不太行,我之前也研究过,后来放弃了。errs 里面的 key 是用 Namespace 填充的, RegisterTagNameFunc 修改 tagName 后,Namespace 也会同时改变
现在用自定义实现的