相关数据结构
自定义规则方法定义,以及对应的输入参数数据结构。
// RuleFuncInput holds the input parameters that passed to custom rule function RuleFunc.
type RuleFuncInput struct {
// Rule specifies the validation rule string, like "required", "between:1,100", etc.
Rule string
// Message specifies the custom error message or configured i18n message for this rule.
Message string
// Value specifies the value for this rule to validate.
Value *gvar.Var
// Data specifies the `data` which is passed to the Validator. It might be a type of map/struct or a nil value.
// You can ignore the parameter `Data` if you do not really need it in your custom validation rule.
Data *gvar.Var
}
// RuleFunc is the custom function for data validation.
type RuleFunc func(ctx context.Context, in RuleFuncInput) error
方法参数简要说明:
- 上下文参数
ctx
是必须的。 RuleFuncInput
数据结构说明:Rule
表示当前的校验规则,包含规则的参数,例如:required
,between:1,100
,length:6
等等。Message
参数表示在校验失败后返回的校验错误提示信息。Value
参数表示被校验的数据值,注意类型是一个*gvar.Var
泛型,因此您可以传递任意类型的参数。Data
参数表示校验时传递的参数,例如校验的是一个map
或者struct
时,往往在联合校验时有用。需要注意的是,这个值是运行时输入的,值可能是nil
。
自定义错误默认情况下已支持 i18n
特性,因此您只需要按照 gf.gvalid.rule.自定义规则名称
配置 i18n
转译信息即可,该信息在校验失败时会自动从 i18n
管理器获取后,通过 Message
参数传入给您注册的自定义校验方法中。
全局校验规则注册
自定义规则分为两种:全局规则注册和局部规则注册。
全局规则是全局生效的规则,注册之后无论是使用方法还是对象来执行数据校验都可以使用自定义的规则。
注册校验方法:
// RegisterRule registers custom validation rule and function for package.
func RegisterRule(rule string, f RuleFunc) {
customRuleFuncMap[rule] = f
}
// RegisterRuleByMap registers custom validation rules using map for package.
func RegisterRuleByMap(m map[string]RuleFunc) {
for k, v := range m {
customRuleFuncMap[k] = v
}
}
您需要按照 RuleFunc
类型的方法定义,实现一个您需要的校验方法,随后使用 RegisterRule
注册到 gvalid
模块中全局管理。该注册逻辑往往是在程序初始化时执行。该方法在对数据进行校验时将会被自动调用,方法返回 nil
表示校验通过,否则应当返回一个非空的 error
类型值。
注意事项:自定义规则的注册方法不支持并发调用,您需要在程序启动时进行注册(例如在 boot
包中处理),无法在运行时动态注册,否则会产生并发安全问题。