效验类

package
v0.0.0-...-2910145 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 14, 2024 License: MIT Imports: 25 Imported by: 0

Documentation

Overview

Package gvalid 提供了强大且实用的数据/表单验证功能。

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func DeleteRule

func DeleteRule(rules ...string)

DeleteRule 从全局包中删除一个或多个自定义验证规则及其关联函数。

func GetRegisteredRuleMap

func GetRegisteredRuleMap() map[string]RuleFunc

GetRegisteredRuleMap 返回所有已注册的自定义规则及其关联的函数。

func GetTags

func GetTags() []string

GetTags 返回验证标签。

func ParseTagValue

func ParseTagValue(tag string) (field, rule, msg string)

ParseTagValue解析一个序列标签到字段、规则和错误消息。 序列标签格式类似:[别名@]规则[...#消息...]

func RegisterRule

func RegisterRule(rule string, f RuleFunc)

RegisterRule 注册自定义验证规则及其相关函数,供包内使用。

func RegisterRuleByMap

func RegisterRuleByMap(m map[string]RuleFunc)

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

func (v *Validator) Assoc(assoc interface{}) *Validator

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

func (v *Validator) Bail() *Validator

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

func (v *Validator) Ci() *Validator

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

func (v *Validator) Clone() *Validator

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

func (v *Validator) Data(data interface{}) *Validator

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

func (v *Validator) Foreach() *Validator

Foreach 注释:对于当前值作为数组进行处理,并对其每个元素进行验证。 注意,此装饰规则仅对下一次验证规则生效一次,特别是针对单个值的验证。

func (*Validator) I18n

func (v *Validator) I18n(i18nManager *gi18n.Manager) *Validator

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

func (v *Validator) Messages(messages interface{}) *Validator

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

func (v *Validator) RuleFunc(rule string, f RuleFunc) *Validator

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

func (v *Validator) RuleFuncMap(m map[string]RuleFunc) *Validator

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

func (v *Validator) Rules(rules interface{}) *Validator

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

func (v *Validator) Run(ctx context.Context) Error

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:

Directories

Path Synopsis
internal
builtin
Package builtin 实现了内置的验证规则。
Package builtin 实现了内置的验证规则。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL