效验类

package
v0.0.0-...-fcd50c7 Latest Latest
Warning

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

Go to latest
Published: Aug 21, 2024 License: MIT Imports: 25 Imported by: 0

Documentation

Overview

包gvalid实现了强大且实用的数据/表单验证功能。 md5:e037cf7a2dd78c4c

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func DeleteRule

func DeleteRule(rules ...string)

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

func GetRegisteredRuleMap

func GetRegisteredRuleMap() map[string]RuleFunc

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

func GetTags

func GetTags() []string

GetTags 返回验证标签。 md5:58fb30086314fe05

func ParseTagValue

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

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

func RegisterRule

func RegisterRule(rule string, f RuleFunc)

RegisterRule 为包注册自定义验证规则和函数。 md5:bb0c3971adfb8935

func RegisterRuleByMap

func RegisterRuleByMap(m map[string]RuleFunc)

RegisterRuleByMap 通过映射为包注册自定义验证规则。 md5:6f3ae52bddfd4a24

Types

type CustomMsg

type CustomMsg = map[string]interface{}

CustomMsg 是自定义错误消息类型,例如:map[field] => string|map[rule]string md5:7623c4a13054d811

type Error

type Error interface {
	Code() gcode.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
	Strings() (errs []string)
}

Error是验证结果的错误。 md5:333865ca9d205dfa

type RuleFunc

type RuleFunc func(ctx context.Context, in RuleFuncInput) error

RuleFunc 是用于数据验证的自定义函数。 md5:7988c41777832ac1

type RuleFuncInput

type RuleFuncInput struct {
	// Rule 定义了验证规则字符串,例如 "required"、"between:1,100" 等等。 md5:0903f4201c9e300d
	Rule string

	// Message 指定此规则的自定义错误消息或配置的 i18n 消息。 md5:407649d2c7943432
	Message string

	// Field 指定此规则要验证的字段。 md5:b21049696367d3c3
	Field string

	// ValueType 指定了值的类型,可能为 nil。 md5:b1ad5cfd9a152a1d
	ValueType reflect.Type

	// Value 指定此规则用于验证的值。 md5:29bdb57107181fe6
	Value *gvar.Var

	// Data 指定了传递给Validator的数据,它可以是map/结构体类型或nil值。如果你的自定义验证规则不需要这个参数,可以忽略它。
	// md5:fd9ebb5b1bdabe03
	Data *gvar.Var
}

RuleFuncInput 是传递给自定义规则函数 RuleFunc 的输入参数。 md5:071da67c908f30a9

type Validator

type Validator struct {
	// contains filtered or unexported fields
}

Validator是用于链式操作的验证管理器。 md5:4554cd1e10f5c88e

func New

func New() *Validator

New 创建并返回一个新的Validator.. md5:cca3c6d267bf0323

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。 md5:45823829185f6ad6

Example
package main

import (
	"context"
	"fmt"

	"github.com/888go/goframe/frame/g"

	gconv "github.com/888go/goframe/util/gconv"
)

func main() {
	type User struct {
		Name string `v:"required"`
		Type int    `v:"required"`
	}
	data := g.Map{
		"name": "john",
	}
	user := User{}

	if err := gconv.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设置在遇到第一个验证错误后停止验证的标记。 md5:219188161ae03b77

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 设置标记,表示对于需要值比较的规则进行不区分大小写的处理。 md5:a248130276497a1f

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",规则检查通过了. md5:1ea4cafc6ed3b9d0
			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,它是当前对象的浅拷贝。 md5:3524ef480b75393c

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是一个链式操作函数,为当前操作设置验证数据。 md5:4bbfa1bb8271d34e

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之间. md5:73fe6ad826054b75
		}
	)
	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 通知下一个验证器将当前值作为数组对待,并验证它的每个元素。 注意,此装饰规则仅对下一个验证规则生效一次,特别适用于单值验证。 md5:59e49ab195827b14

func (*Validator) I18n

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

I18n 设置验证器的i18n管理器。 md5:aeb8eebb20995b34

Example
package main

import (
	"context"
	"fmt"

	"github.com/888go/goframe/i18n/gi18n"

	gtest "github.com/888go/goframe/test/gtest"

	gvalid "github.com/888go/goframe/util/gvalid"
)

func main() {
	var (
		i18nManager = gi18n.New(gi18n.Options{Path: gtest.DataPath("i18n")})
		ctxCn       = gi18n.WithLanguage(context.Background(), "cn")
		validator   = gvalid.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,它支持在错误结果中按顺序显示消息。 md5:442bfbf7d1878c37

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。 md5:3733cab7b3035ce3

Example
package main

import (
	"context"
	"errors"
	"fmt"

	"github.com/888go/goframe/frame/g"

	gvalid "github.com/888go/goframe/util/gvalid"
)

func main() {
	var (
		ctx             = context.Background()
		lenErrRuleName  = "LenErr"
		passErrRuleName = "PassErr"
		lenErrRuleFunc  = func(ctx context.Context, in gvalid.RuleFuncInput) error {
			pass := in.Value.String()
			if len(pass) != 6 {
				return errors.New(in.Message)
			}
			return nil
		}
		passErrRuleFunc = func(ctx context.Context, in gvalid.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",
	}
	// single error sample
	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",
	}
	// multi error sample
	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。 md5:38d8a4ac760a431a

Example
package main

import (
	"context"
	"errors"
	"fmt"

	"github.com/888go/goframe/frame/g"

	gvalid "github.com/888go/goframe/util/gvalid"
)

func main() {
	var (
		ctx             = context.Background()
		lenErrRuleName  = "LenErr"
		passErrRuleName = "PassErr"
		lenErrRuleFunc  = func(ctx context.Context, in gvalid.RuleFuncInput) error {
			pass := in.Value.String()
			if len(pass) != 6 {
				return errors.New(in.Message)
			}
			return nil
		}
		passErrRuleFunc = func(ctx context.Context, in gvalid.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]gvalid.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 是一个链接操作函数,用于为当前操作设置自定义验证规则。 md5:20d3aa2d271b3575

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 开始根据规则和消息验证给定的数据。 md5:4345968979b93f1e

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
包 builtin 实现了内置的验证规则。
包 builtin 实现了内置的验证规则。

Jump to

Keyboard shortcuts

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