校验对象

数据校验组件提供了数据校验对象,用于数据校验的统一的配置管理、便捷的链式操作。

接口文档https://pkg.go.dev/github.com/gogf/gf/v2/util/gvalid

  1. type Validator
  2. func New() *Validator
  3. func (v *Validator) Assoc(assoc interface{}) *Validator
  4. func (v *Validator) Bail() *Validator
  5. func (v *Validator) Ci() *Validator
  6. func (v *Validator) Clone() *Validator
  7. func (v *Validator) Data(data interface{}) *Validator
  8. func (v *Validator) I18n(i18nManager *gi18n.Manager) *Validator
  9. func (v *Validator) Messages(messages interface{}) *Validator
  10. func (v *Validator) RuleFunc(rule string, f RuleFunc) *Validator
  11. func (v *Validator) RuleFuncMap(m map[string]RuleFunc) *Validator
  12. func (v *Validator) Rules(rules interface{}) *Validator
  13. func (v *Validator) Run(ctx context.Context) Error

简要说明:

  1. New 方法用于创建一个新的校验对象。
  2. Assoc 用于关联数据校验,具体请查看后续章节介绍。
  3. Bail 方法用于设定只要后续的多个校验中有一个规则校验失败则停止校验立即返回错误结果。
  4. Ci 方法用于设置需要比较数值的规则时,不区分字段的大小写。
  5. Run 方法对给定规则和信息的数据进行校验操作。
  6. I18n 方法用于设置当前校验对象的 I18N 国际化组件。默认情况下,校验组件使用的是框架全局默认的 i18n 组件对象。
  7. Data 方法用于传递需要联合校验的数据集合,往往传递的是 map 类型或者 struct 类型。
  8. Rules 方法用于传递当前链式操作校验的自定义校验规则,往往使用 []string 类型或者 map 类型。
  9. Messages 方法用于传递当前链式操作校验的自定义错误提示信息,往往使用 map 类型传递,具体看后续代码示例。

数据校验-校验对象 - 图1提示

由于数据校验对象也是一个非常常用的对象,因此 g 模块中定义了 Validator 方法来快捷创建校验对象。大部分场景下我们推荐使用 g 模块的 g.Validator() 方式来快捷创建一个校验对象,关于 g 模块的介绍请参考章节: 对象管理

使用示例

单数据校验

  1. var (
  2. err error
  3. ctx = gctx.New()
  4. )
  5. err = g.Validator().
  6. Rules("min:18").
  7. Data(16).
  8. Messages("未成年人不允许注册哟").
  9. Run(ctx)
  10. fmt.Println(err.Error())
  11. // Output:
  12. // 未成年人不允许注册哟
  1. var (
  2. err error
  3. ctx = gctx.New()
  4. data = g.Map{
  5. "password": "123",
  6. }
  7. )
  8. err = g.Validator().Data("").Assoc(data).
  9. Rules("required-with:password").
  10. Messages("请输入确认密码").
  11. Run(ctx)
  12. fmt.Println(err.Error())

Struct 数据校验

  1. type User struct {
  2. Name string `v:"required#请输入用户姓名"`
  3. Type int `v:"required#请选择用户类型"`
  4. }
  5. var (
  6. err error
  7. ctx = gctx.New()
  8. user = User{}
  9. data = g.Map{
  10. "name": "john",
  11. }
  12. )
  13. if err = gconv.Scan(data, &user); err != nil {
  14. panic(err)
  15. }
  16. err = g.Validator().Assoc(data).Data(user).Run(ctx)
  17. if err != nil {
  18. fmt.Println(err.(gvalid.Error).Items())
  19. }
  20. // Output:
  21. // [map[Type:map[required:请选择用户类型]]]

Map 数据校验

  1. params := map[string]interface{}{
  2. "passport": "",
  3. "password": "123456",
  4. "password2": "1234567",
  5. }
  6. rules := map[string]string{
  7. "passport": "required|length:6,16",
  8. "password": "required|length:6,16|same:password2",
  9. "password2": "required|length:6,16",
  10. }
  11. messages := map[string]interface{}{
  12. "passport": "账号不能为空|账号长度应当在{min}到{max}之间",
  13. "password": map[string]string{
  14. "required": "密码不能为空",
  15. "same": "两次密码输入不相等",
  16. },
  17. }
  18. err := g.Validator().Messages(messages).Rules(rules).Data(params).Run(gctx.New())
  19. if err != nil {
  20. g.Dump(err.Maps())
  21. }

执行后,终端输出:

  1. {
  2. "passport": {
  3. "length": "账号长度应当在6到16之间",
  4. "required": "账号不能为空"
  5. },
  6. "password": {
  7. "same": "两次密码输入不相等"
  8. }
  9. }