Documentation ¶
Overview ¶
Package gvalid 提供了强大且实用的数据/表单验证功能。
Index ¶
- func DeleteRule(rules ...string)
- func GetRegisteredRuleMap() map[string]RuleFunc
- func GetTags() []string
- func ParseTagValue(tag string) (field, rule, msg string)
- func RegisterRule(rule string, f RuleFunc)
- func RegisterRuleByMap(m map[string]RuleFunc)
- type CustomMsg
- type Error
- type RuleFunc
- type RuleFuncInput
- type Validator
- func (v *Validator) Assoc(assoc interface{}) *Validator
- func (v *Validator) Bail() *Validator
- func (v *Validator) Ci() *Validator
- func (v *Validator) Clone() *Validator
- func (v *Validator) Data(data interface{}) *Validator
- func (v *Validator) Foreach() *Validator
- func (v *Validator) I18n(i18nManager *gi18n.Manager) *Validator
- func (v *Validator) Messages(messages interface{}) *Validator
- func (v *Validator) RuleFunc(rule string, f RuleFunc) *Validator
- func (v *Validator) RuleFuncMap(m map[string]RuleFunc) *Validator
- func (v *Validator) Rules(rules interface{}) *Validator
- func (v *Validator) Run(ctx context.Context) Error
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func GetRegisteredRuleMap ¶
GetRegisteredRuleMap 返回所有已注册的自定义规则及其关联的函数。
func ParseTagValue ¶
ParseTagValue解析一个序列标签到字段、规则和错误消息。 序列标签格式类似:[别名@]规则[...#消息...]
func RegisterRuleByMap ¶
RegisterRuleByMap 通过映射表为包注册自定义验证规则。
Types ¶
type CustomMsg ¶
type CustomMsg = map[string]interface{}
CustomMsg 是自定义错误消息类型, 形如:map[field] => string|map[rule]string (注释解释:此代码定义了一个名为 CustomMsg 的自定义错误消息类型,它是一个映射结构,键为字段名,值可以是字符串或另一个映射结构,其中内部映射的键为规则名,值为字符串。这个类型用于根据特定字段和规则生成或存储自定义的错误消息。)
type Error ¶
type Error interface { Code() 错误码类.Code Current() error Error() string FirstItem() (key string, messages map[string]error) FirstRule() (rule string, err error) FirstError() (err error) Items() (items []map[string]map[string]error) Map() map[string]error Maps() map[string]map[string]error String() string X取文本数组() (errs []string) }
Error 是验证结果的错误信息。
type RuleFunc ¶
type RuleFunc func(ctx context.Context, in RuleFuncInput) error
RuleFunc 是用于数据验证的自定义函数。
type RuleFuncInput ¶
type RuleFuncInput struct { // Rule 指定验证规则字符串,如 "必填", "范围:1,100" 等等。 Rule string // Message 指定此规则的自定义错误消息或配置的 i18n 消息。 Message string // Field 指定该规则进行验证的字段。 Field string // ValueType 指定值的类型,该值可能为 nil。 ValueType reflect.Type // Value 指定此规则验证的值。 Value *泛型类.Var // Data 指定传递给 Validator 的 `data`,它可以是 map 或 struct 类型,也可以是 nil 值。 // 如果在自定义验证规则中并不真正需要这个参数,你可以忽略 `Data`。 Data *泛型类.Var }
RuleFuncInput 用于存储传递给自定义规则函数 RuleFunc 的输入参数。
type Validator ¶
type Validator struct {
// contains filtered or unexported fields
}
Validator 是用于链接操作的验证管理器。
func New ¶
func New() *Validator
New 创建并返回一个新的验证器。
Example ¶
package main import ( "context" "fmt" "github.com/888go/goframe/frame/g" ) func main() { if err := g.X效验类().Data(16).Rules("min:18").Run(context.Background()); err != nil { fmt.Println(err) } }
Output: The value `16` must be equal or greater than 18
func (*Validator) Assoc ¶
Assoc 是一个链式操作函数,用于为当前操作设置关联验证数据。 可选参数 `assoc` 通常为 map 类型,用于指定联合验证中使用的参数映射。 当调用该函数并传入 `assoc` 参数时,同时会将 `useAssocInsteadOfObjectAttributes` 设置为 true。
Example ¶
type User struct { Name string `v:"required"` Type int `v:"required"` } data := g.Map{ "name": "john", } user := User{} if err := 转换类.Scan(data, &user); err != nil { panic(err) } if err := g.X效验类().Data(user).Assoc(data).Run(context.Background()); err != nil { fmt.Print(err) }
Output: The Type field is required
func (*Validator) Bail ¶
Bail 设置标记,在出现第一个验证错误后停止验证。
Example ¶
package main import ( "context" "fmt" "github.com/888go/goframe/frame/g" ) func main() { type BizReq struct { Account string `v:"required|length:6,16|same:QQ"` QQ string Password string `v:"required|same:Password2"` Password2 string `v:"required"` } var ( ctx = context.Background() req = BizReq{ Account: "gf", QQ: "123456", Password: "goframe.org", Password2: "goframe.org", } ) if err := g.X效验类().Bail().Data(req).Run(ctx); err != nil { fmt.Println("Use Bail Error:", err) } if err := g.X效验类().Data(req).Run(ctx); err != nil { fmt.Println("Not Use Bail Error:", err) } }
Output: Use Bail Error: The Account value `gf` length must be between 6 and 16 Not Use Bail Error: The Account value `gf` length must be between 6 and 16; The Account value `gf` must be the same as field QQ value `123456`
func (*Validator) Ci ¶
Ci 设置标记,用于那些需要值比较的规则,实现大小写不敏感。
Example ¶
package main import ( "context" "fmt" "github.com/888go/goframe/frame/g" ) func main() { type BizReq struct { Account string `v:"required"` Password string `v:"required|same:Password2"` Password2 string `v:"required"` } var ( ctx = context.Background() req = BizReq{ Account: "gf", Password: "Goframe.org", // 与 Password2 不同,但由于“ci”的存在,规则检查通过 Password2: "goframe.org", } ) if err := g.X效验类().Data(req).Run(ctx); err != nil { fmt.Println("Not Use CI Error:", err) } if err := g.X效验类().Ci().Data(req).Run(ctx); err == nil { fmt.Println("Use CI Passed!") } }
Output: Not Use CI Error: The Password value `Goframe.org` must be the same as field Password2 value `goframe.org` Use CI Passed!
func (*Validator) Clone ¶
Clone 创建并返回一个新的 Validator,它是当前 Validator 的浅复制。
Example ¶
package main import ( "context" "fmt" "github.com/888go/goframe/frame/g" ) func main() { if err := g.X效验类().Data(16).Rules("min:18").Run(context.Background()); err != nil { fmt.Println(err) } if err := g.X效验类().Clone().Data(20).Run(context.Background()); err != nil { fmt.Println(err) } else { fmt.Println("Check Success!") } }
Output: The value `16` must be equal or greater than 18 Check Success!
func (*Validator) Data ¶
Data 是一个链式操作函数,用于为当前操作设置验证数据。
Example ¶
package main import ( "context" "fmt" "github.com/888go/goframe/frame/g" ) func main() { type BizReq struct { Password1 string `v:"password"` Password2 string `v:"password"` } var ( ctx = context.Background() req = BizReq{ Password1: "goframe", Password2: "gofra", // 错误信息长度应在6到18个字符之间 } ) if err := g.X效验类().Data(req).Run(ctx); err != nil { fmt.Print(err) } }
Output: The Password2 value `gofra` is not a valid password format
func (*Validator) Foreach ¶
Foreach 注释:对于当前值作为数组进行处理,并对其每个元素进行验证。 注意,此装饰规则仅对下一次验证规则生效一次,特别是针对单个值的验证。
func (*Validator) I18n ¶
I18n 为验证器设置国际化管理器。
Example ¶
var ( i18nManager = gi18n.New(gi18n.Options{Path: 单元测试类.DataPath("i18n")}) ctxCn = gi18n.WithLanguage(context.Background(), "cn") validator = 效验类.New() ) validator = validator.Data(16).Rules("min:18") if err := validator.Run(context.Background()); err != nil { fmt.Println(err) } if err := validator.I18n(i18nManager).Run(ctxCn); err != nil { fmt.Println(err) }
Output: The value `16` must be equal or greater than 18 字段值`16`字段最小值应当为18
func (*Validator) Messages ¶
Messages 是一个链式操作函数,用于为当前操作设置自定义错误消息。 参数 `messages` 可以是 string/[]string/map[string]string 类型。如果 `rules` 类型为 []string,则支持在错误结果中按顺序展示消息。 更详细的翻译: ```go Messages 函数提供链式操作功能,允许为当前执行的操作设定个性化的错误信息。 其参数 `messages` 的类型可以是字符串(string)、字符串切片([]string)或字符串到字符串的映射(map[string]string)。 特别地,当 `rules` 参数为字符串切片([]string)类型时,Messages 函数能够支持按照规则数组中的顺序,在生成的错误结果中逐条展示相应的错误消息。
Example ¶
package main import ( "context" "fmt" "github.com/888go/goframe/frame/g" ) func main() { if err := g.X效验类().Data(16).Rules("min:18").Messages("Can not regist, Age is less then 18!").Run(context.Background()); err != nil { fmt.Println(err) } }
Output: Can not regist, Age is less then 18!
func (*Validator) RuleFunc ¶
RuleFunc 将一个自定义规则函数注册到当前的 Validator。
Example ¶
var ( ctx = context.Background() lenErrRuleName = "LenErr" passErrRuleName = "PassErr" lenErrRuleFunc = func(ctx context.Context, in 效验类.RuleFuncInput) error { pass := in.Value.String() if len(pass) != 6 { return errors.New(in.Message) } return nil } passErrRuleFunc = func(ctx context.Context, in 效验类.RuleFuncInput) error { pass := in.Value.String() if m := in.Data.X取Map(); m["data"] != pass { return errors.New(in.Message) } return nil } ) type LenErrStruct struct { Value string `v:"uid@LenErr#Value Length Error!"` Data string `p:"data"` } st := &LenErrStruct{ Value: "123", Data: "123456", } // 单个错误示例 if err := g.X效验类().RuleFunc(lenErrRuleName, lenErrRuleFunc).Data(st).Run(ctx); err != nil { fmt.Println(err) } type MultiErrorStruct struct { Value string `v:"uid@LenErr|PassErr#Value Length Error!|Pass is not Same!"` Data string `p:"data"` } multi := &MultiErrorStruct{ Value: "123", Data: "123456", } // 多错误示例 if err := g.X效验类().RuleFunc(lenErrRuleName, lenErrRuleFunc).RuleFunc(passErrRuleName, passErrRuleFunc).Data(multi).Run(ctx); err != nil { fmt.Println(err) }
Output: Value Length Error! Value Length Error!; Pass is not Same!
func (*Validator) RuleFuncMap ¶
RuleFuncMap 将多个自定义规则函数注册到当前的 Validator。
Example ¶
var ( ctx = context.Background() lenErrRuleName = "LenErr" passErrRuleName = "PassErr" lenErrRuleFunc = func(ctx context.Context, in 效验类.RuleFuncInput) error { pass := in.Value.String() if len(pass) != 6 { return errors.New(in.Message) } return nil } passErrRuleFunc = func(ctx context.Context, in 效验类.RuleFuncInput) error { pass := in.Value.String() if m := in.Data.X取Map(); m["data"] != pass { return errors.New(in.Message) } return nil } ruleMap = map[string]效验类.RuleFunc{ lenErrRuleName: lenErrRuleFunc, passErrRuleName: passErrRuleFunc, } ) type MultiErrorStruct struct { Value string `v:"uid@LenErr|PassErr#Value Length Error!|Pass is not Same!"` Data string `p:"data"` } multi := &MultiErrorStruct{ Value: "123", Data: "123456", } if err := g.X效验类().RuleFuncMap(ruleMap).Data(multi).Run(ctx); err != nil { fmt.Println(err) }
Output: Value Length Error!; Pass is not Same!
func (*Validator) Rules ¶
Rules 是一个链式操作函数,用于为当前操作设置自定义验证规则。
Example ¶
package main import ( "context" "fmt" "github.com/888go/goframe/frame/g" ) func main() { if err := g.X效验类().Data(16).Rules("min:18").Run(context.Background()); err != nil { fmt.Println(err) } }
Output: The value `16` must be equal or greater than 18
func (*Validator) Run ¶
Run 开始使用规则和消息验证给定的数据。
Example ¶
package main import ( "context" "fmt" "github.com/888go/goframe/frame/g" ) func main() { // check value mode if err := g.X效验类().Data(16).Rules("min:18").Run(context.Background()); err != nil { fmt.Println("check value err:", err) } // check map mode data := map[string]interface{}{ "passport": "", "password": "123456", "password2": "1234567", } rules := map[string]string{ "passport": "required|length:6,16", "password": "required|length:6,16|same:password2", "password2": "required|length:6,16", } if err := g.X效验类().Data(data).Rules(rules).Run(context.Background()); err != nil { fmt.Println("check map err:", err) } // check struct mode type Params struct { Page int `v:"required|min:1"` Size int `v:"required|between:1,100"` ProjectId string `v:"between:1,10000"` } rules = map[string]string{ "Page": "required|min:1", "Size": "required|between:1,100", "ProjectId": "between:1,10000", } obj := &Params{ Page: 0, Size: 101, } if err := g.X效验类().Data(obj).Run(context.Background()); err != nil { fmt.Println("check struct err:", err) } // May Output: // check value err: The value `16` must be equal or greater than 18 // check map err: The passport field is required; The passport value `` length must be between 6 and 16; The password value `123456` must be the same as field password2 // check struct err: The Page value `0` must be equal or greater than 1; The Size value `101` must be between 1 and 100 }
Output: