Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

自定义校验规则

虽然gvalid已经内置了常见的数十种校验规则,但是在部分业务场景下我们需要自定义校验规则,特别是一些可以重复使用的业务相关的校验规则。当然,gvalid如此的强大,她已经为您考虑得如此周全。

...

注意事项:从性能考虑,自定义规则的注册方法不支持并发调用,您需要在程序启动时进行注册(例如在boot包中处理),无法在运行时动态注册,否则会产生并发安全问题。

示例1,用户唯一性规则

在用户注册时,我们往往需要校验当前用户提交的名称/账号是否唯一,因此我们可以注册一个unique-name的全局规则来实现。

registerRule := "unique-name"
gvalid.RegisterRule(registerRule, func(rule string, value interface{}, message string, params map[string]interface{}) error {
	var (
		id   = gconv.Int(params["Id"])
		name = gconv.String(value)
	)
	n, err := g.Table("user").Where("id != ? and name = ?", id, name).Count()
	if err != nil {
		return err
	}
	if n > 0 {
		return errors.New(message)
	}
	return nil
})
type User struct {
	Id   int
	Name string `v:"required|unique-name # 请输入用户名称|用户名称已被占用"`
	Pass string `v:"required|length:6,18"`
}
user := &User{
	Id:   1,
	Name: "john",
	Pass: "123456",
}
err := gvalid.CheckStruct(user, nil)
fmt.Println(err.Error())
// Output:
// 用户名称已被占用

示例2,自定义实现required规则

默认情况下,gvalid的内置规则是不支持mapslice类型的required规则校验,因此我们可以自行实现,然后覆盖原有规则。其他的规则也可以按照此逻辑自定义覆盖。

...