既然 gin 都已经集成了 go-playground/validator/v10 ,我们为啥不扩展一下下它呢?
比如,验证字符串长度必须在6~8这个区间中
type Request struct {
Name string `json:"name" binding:"required,minLen=6,maxLen=8"`
}
按照 go-playground/validator/v10 提供的例子,我大概要写这样的验证函数
// 不许字符串长度大于设定值
func maxLen(fl validator.FieldLevel) bool {
vlen := len(fl.Field().String())
param := fl.Param()
if param == "" {
panic("maxLen format: maxLen=1")
}
v, err := strconv.Atoi(param)
if err != nil {
panic("maxLen:" + err.Error())
}
return vlen <= v
}
// 不许字符串长度小于设定值
func minLen(fl validator.FieldLevel) bool {
// ... 与maxLen太像,这里省略它
return vlen >= v
}
好了,现在谁来告诉我要怎么把它们接入到 gin
(5分钟过去后,我还是没等到那个人,所以就去看代码了)
代码说 binding.Validator.Engine()
里面装着 *validator.Validate
, go-playground/validator/v10 说那咱们接着抄例子吧
// 调用它,完成扩展注册
func InitExtendValidation() {
v, ok := binding.Validator.Engine().(*validator.Validate)
if !ok {
log.Fatal().Msg("validator engine changed")
return
}
// 注册新的自定义验证规则
var err error
for _, e := range []struct {
tag string
fn func(fl validator.FieldLevel) bool
}{
{"minLen", minLen},
{"maxLen", maxLen},
} {
err = v.RegisterValidation(e.tag, e.fn)
if err != nil {
log.Fatal().Err(err).Str("tag", e.tag).Msg("validator")
}
}
}
哎,这就完了。
网友评论