go-playground / validator

:100:Go Struct and Field validation, including Cross Field, Cross Struct, Map, Slice and Array diving
MIT License
16.64k stars 1.32k forks source link

How to take the fields in the structure that are converted to json when translating. For example, in the code I provided, I want to get phone instead of Phone #1208

Closed cmxStarCoding closed 9 months ago

cmxStarCoding commented 9 months ago

Package version eg. v9, v10:

v9

Issue, Question or Enhancement:

I want to use an uppercase Phone in the structure and a lowercase phone when an error message is returned image

Code sample, to showcase or reproduce:

// core/validator/user_validator.go

package validator

import (
    "fmt"
    "github.com/gin-gonic/gin"
    ut "github.com/go-playground/universal-translator"
    "gopkg.in/go-playground/validator.v9"
)

type UserLoginRequest struct {
    //Username string `json:"username" binding:"required,min=4,max=20"`
    //Phone   string  `json:"phone" form:"phone" validate:"required,email"`
    Phone    string  `json:"phone" form:"phone" validate:"required"`
    Password string  `json:"password" form:"password" validate:"required,min=6"`
}

func ValidateUserLogin(c *gin.Context) (*UserLoginRequest, error) {
    var request UserLoginRequest
    utTrans := c.Value("Trans").(ut.Translator)

    Validate, _ := c.Get("Validate")
    validatorInstance, _ := Validate.(*validator.Validate)

    if err := c.ShouldBindJSON(&request); err != nil {
        return nil,err
    }

    //自定义错误语句
    //validatorInstance.RegisterTranslation("required", utTrans, func(ut ut.Translator) error {
    //  return ut.Add("required", "{0} 哈哈哈!", true) // see universal-translator for details
    //}, func(ut ut.Translator, fe validator.FieldError) string {
    //  t, _ := ut.T("required", fe.Field())
    //  return t
    //})

    //validatorInstance.RegisterTranslation(
    //  "email",
    //  utTrans,
    //  func(ut ut.Translator) error {
    //      return ut.Add("email", "{0}格式不正确", true)
    //  },
    //  func(ut ut.Translator, fe validator.FieldError) string {
    //      t, _ := ut.T("email", fe.Field())
    //      return t
    //  },
    //)

    // 进行进一步的验证
    err := validatorInstance.Struct(request) //这里的err是未翻译之前的
    if  err != nil {
        errs := err.(validator.ValidationErrors)
        var sliceErrs []string
        for _, e := range errs {
            sliceErrs = append(sliceErrs, e.Translate(utTrans))
        }
        return nil,fmt.Errorf(sliceErrs[0])
    }

    return &request,nil
}
cmxStarCoding commented 9 months ago

The problem has been solved.