2021-01-17 21:46:25 +08:00
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
2020-08-21 00:00:00 +08:00
//
// This Source Code Form is subject to the terms of the MIT License.
// If a copy of the MIT was not distributed with this file,
// You can obtain one at https://github.com/gogf/gf.
package gvalid_test
import (
2021-05-13 20:56:52 +08:00
"context"
2021-12-07 13:49:08 +08:00
"errors"
2020-08-21 00:00:00 +08:00
"fmt"
2022-11-01 20:12:21 +08:00
2021-12-07 13:49:08 +08:00
"github.com/gogf/gf/v2/container/gvar"
2021-10-11 21:41:56 +08:00
"github.com/gogf/gf/v2/frame/g"
2021-12-07 13:49:08 +08:00
"github.com/gogf/gf/v2/i18n/gi18n"
"github.com/gogf/gf/v2/os/gctx"
"github.com/gogf/gf/v2/util/gconv"
"github.com/gogf/gf/v2/util/gvalid"
2020-08-21 00:00:00 +08:00
)
2021-12-07 13:49:08 +08:00
func ExampleNew ( ) {
validator := gvalid . New ( )
if err := validator . Data ( 16 ) . Rules ( "min:18" ) . Run ( context . Background ( ) ) ; err != nil {
fmt . Println ( err )
2021-11-30 23:48:26 +08:00
}
// Output:
2021-12-07 13:49:08 +08:00
// The value `16` must be equal or greater than 18
2021-11-30 23:48:26 +08:00
}
2021-12-07 13:49:08 +08:00
func ExampleValidator_Run ( ) {
// check value mode
if err := g . Validator ( ) . Data ( 16 ) . Rules ( "min:18" ) . Run ( context . Background ( ) ) ; err != nil {
fmt . Println ( "check value err:" , err )
2021-11-30 23:48:26 +08:00
}
2021-12-07 13:49:08 +08:00
// check map mode
data := map [ string ] interface { } {
"passport" : "" ,
"password" : "123456" ,
"password2" : "1234567" ,
2021-11-30 23:48:26 +08:00
}
2021-12-07 13:49:08 +08:00
rules := map [ string ] string {
"passport" : "required|length:6,16" ,
"password" : "required|length:6,16|same:password2" ,
"password2" : "required|length:6,16" ,
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
if err := g . Validator ( ) . Data ( data ) . Rules ( rules ) . Run ( context . Background ( ) ) ; err != nil {
fmt . Println ( "check map err:" , err )
2021-11-30 23:48:26 +08:00
}
2021-12-07 13:49:08 +08:00
// 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" `
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
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 . Validator ( ) . Data ( obj ) . Run ( context . Background ( ) ) ; err != nil {
fmt . Println ( "check struct err:" , err )
2021-11-30 23:48:26 +08:00
}
2021-12-07 13:49:08 +08:00
// 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
2021-11-30 23:48:26 +08:00
}
2021-12-07 13:49:08 +08:00
func ExampleValidator_Clone ( ) {
if err := g . Validator ( ) . Data ( 16 ) . Rules ( "min:18" ) . Run ( context . Background ( ) ) ; err != nil {
fmt . Println ( err )
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
if err := g . Validator ( ) . Clone ( ) . Data ( 20 ) . Run ( context . Background ( ) ) ; err != nil {
2021-12-05 14:56:34 +08:00
fmt . Println ( err )
2021-12-07 13:49:08 +08:00
} else {
fmt . Println ( "Check Success!" )
2021-12-05 14:56:34 +08:00
}
2021-11-30 23:48:26 +08:00
2021-12-05 14:56:34 +08:00
// Output:
2021-12-07 13:49:08 +08:00
// The value `16` must be equal or greater than 18
// Check Success!
2021-12-05 14:56:34 +08:00
}
2021-11-30 23:48:26 +08:00
2021-12-07 13:49:08 +08:00
func ExampleValidator_I18n ( ) {
2021-12-05 14:56:34 +08:00
var (
2021-12-07 13:49:08 +08:00
i18nManager = gi18n . New ( )
ctxCn = gi18n . WithLanguage ( context . Background ( ) , "cn" )
validator = gvalid . New ( )
2021-12-05 14:56:34 +08:00
)
2021-11-30 23:48:26 +08:00
2021-12-07 13:49:08 +08:00
validator = validator . Data ( 16 ) . Rules ( "min:18" )
2021-12-05 14:56:34 +08:00
2021-12-07 13:49:08 +08:00
if err := validator . Run ( context . Background ( ) ) ; err != nil {
fmt . Println ( err )
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
if err := validator . I18n ( i18nManager ) . Run ( ctxCn ) ; err != nil {
2021-11-30 23:48:26 +08:00
fmt . Println ( err )
}
// Output:
2021-12-07 13:49:08 +08:00
// The value `16` must be equal or greater than 18
// 字段值`16`字段最小值应当为18
2021-11-30 23:48:26 +08:00
}
2021-12-07 13:49:08 +08:00
func ExampleValidator_Bail ( ) {
2021-11-30 23:48:26 +08:00
type BizReq struct {
2021-12-07 13:49:08 +08:00
Account string ` v:"required|length:6,16|same:QQ" `
2021-11-30 23:48:26 +08:00
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" ,
}
)
2021-12-07 13:49:08 +08:00
if err := g . Validator ( ) . Bail ( ) . Data ( req ) . Run ( ctx ) ; err != nil {
fmt . Println ( "Use Bail Error:" , err )
}
2021-11-30 23:48:26 +08:00
if err := g . Validator ( ) . Data ( req ) . Run ( ctx ) ; err != nil {
2021-12-07 13:49:08 +08:00
fmt . Println ( "Not Use Bail Error:" , err )
2021-11-30 23:48:26 +08:00
}
// output:
2021-12-07 13:49:08 +08:00
// 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
2021-11-30 23:48:26 +08:00
}
2021-12-07 13:49:08 +08:00
func ExampleValidator_Ci ( ) {
2021-12-01 23:16:16 +08:00
type BizReq struct {
Account string ` v:"required" `
2021-12-07 13:49:08 +08:00
Password string ` v:"required|same:Password2" `
2021-12-01 23:16:16 +08:00
Password2 string ` v:"required" `
}
var (
ctx = context . Background ( )
req = BizReq {
Account : "gf" ,
Password : "Goframe.org" , // Diff from Password2, but because of "ci", rule check passed
Password2 : "goframe.org" ,
}
)
if err := g . Validator ( ) . Data ( req ) . Run ( ctx ) ; err != nil {
2021-12-07 13:49:08 +08:00
fmt . Println ( "Not Use CI Error:" , err )
2021-12-01 23:16:16 +08:00
}
2021-11-30 23:48:26 +08:00
2021-12-07 13:49:08 +08:00
if err := g . Validator ( ) . Ci ( ) . Data ( req ) . Run ( ctx ) ; err == nil {
fmt . Println ( "Use CI Passed!" )
2021-12-01 23:16:16 +08:00
}
2021-12-07 13:49:08 +08:00
// output:
// Not Use CI Error: The Password value `Goframe.org` must be the same as field Password2
// Use CI Passed!
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
func ExampleValidator_Data ( ) {
2021-12-05 14:56:34 +08:00
type BizReq struct {
Password1 string ` v:"password" `
Password2 string ` v:"password" `
2021-12-04 14:35:33 +08:00
}
2021-12-05 14:56:34 +08:00
var (
ctx = context . Background ( )
req = BizReq {
Password1 : "goframe" ,
Password2 : "gofra" , // error length between 6 and 18
}
)
if err := g . Validator ( ) . Data ( req ) . Run ( ctx ) ; err != nil {
fmt . Print ( err )
2021-12-04 14:35:33 +08:00
}
2021-12-05 14:56:34 +08:00
// Output:
// The Password2 value `gofra` is not a valid password format
}
2021-12-11 23:11:17 +08:00
func ExampleValidator_Data_Value ( ) {
err := g . Validator ( ) . Rules ( "min:18" ) .
Messages ( "未成年人不允许注册哟" ) .
Data ( 16 ) . Run ( gctx . New ( ) )
fmt . Println ( err . String ( ) )
// Output:
// 未成年人不允许注册哟
}
2021-12-07 13:49:08 +08:00
func ExampleValidator_Data_Map1 ( ) {
params := map [ string ] interface { } {
"passport" : "" ,
"password" : "123456" ,
"password2" : "1234567" ,
}
rules := [ ] string {
"passport@required|length:6,16#账号不能为空|账号长度应当在{min}到{max}之间" ,
"password@required|length:6,16|same{password}2#密码不能为空|密码长度应当在{min}到{max}之间|两次密码输入不相等" ,
"password2@required|length:6,16#" ,
}
if e := g . Validator ( ) . Data ( params ) . Rules ( rules ) . Run ( gctx . New ( ) ) ; e != nil {
fmt . Println ( e . Map ( ) )
fmt . Println ( e . FirstItem ( ) )
fmt . Println ( e . FirstError ( ) )
2021-12-04 14:35:33 +08:00
}
2021-12-07 13:49:08 +08:00
// May Output:
// map[required:账号不能为空 length:账号长度应当在6到16之间]
// passport map[required:账号不能为空 length:账号长度应当在6到16之间]
// 账号不能为空
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
func ExampleValidator_Data_Map2 ( ) {
params := map [ string ] interface { } {
"passport" : "" ,
"password" : "123456" ,
"password2" : "1234567" ,
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
rules := [ ] string {
"passport@length:6,16#账号不能为空|账号长度应当在{min}到{max}之间" ,
"password@required|length:6,16|same:password2#密码不能为空|密码长度应当在{min}到{max}之间|两次密码输入不相等" ,
"password2@required|length:6,16#" ,
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
if e := g . Validator ( ) . Data ( params ) . Rules ( rules ) . Run ( gctx . New ( ) ) ; e != nil {
fmt . Println ( e . Map ( ) )
fmt . Println ( e . FirstItem ( ) )
fmt . Println ( e . FirstError ( ) )
2021-12-05 14:56:34 +08:00
}
// Output:
2021-12-07 13:49:08 +08:00
// map[same:两次密码输入不相等]
// password map[same:两次密码输入不相等]
// 两次密码输入不相等
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
func ExampleValidator_Data_Map3 ( ) {
params := map [ string ] interface { } {
"passport" : "" ,
"password" : "123456" ,
"password2" : "1234567" ,
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
rules := map [ string ] string {
"passport" : "required|length:6,16" ,
"password" : "required|length:6,16|same:password2" ,
"password2" : "required|length:6,16" ,
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
messages := map [ string ] interface { } {
"passport" : "账号不能为空|账号长度应当在{min}到{max}之间" ,
"password" : map [ string ] string {
"required" : "密码不能为空" ,
"same" : "两次密码输入不相等" ,
} ,
2021-12-04 14:35:33 +08:00
}
2021-12-07 13:49:08 +08:00
err := g . Validator ( ) .
Messages ( messages ) .
Rules ( rules ) .
Data ( params ) . Run ( gctx . New ( ) )
if err != nil {
g . Dump ( err . Maps ( ) )
2021-12-04 14:35:33 +08:00
}
2021-12-07 13:49:08 +08:00
// May Output:
// {
// "passport": {
// "length": "账号长度应当在6到16之间",
// "required": "账号不能为空"
// },
// "password": {
// "same": "两次密码输入不相等"
// }
// }
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
// Empty string attribute.
func ExampleValidator_Data_Struct1 ( ) {
type Params struct {
Page int ` v:"required|min:1 # page is required" `
Size int ` v:"required|between:1,100 # size is required" `
ProjectId string ` v:"between:1,10000 # project id must between { min}, { max}" `
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
obj := & Params {
Page : 1 ,
Size : 10 ,
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
err := g . Validator ( ) . Data ( obj ) . Run ( gctx . New ( ) )
fmt . Println ( err == nil )
2021-12-05 14:56:34 +08:00
// Output:
2021-12-07 13:49:08 +08:00
// true
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
// Empty pointer attribute.
func ExampleValidator_Data_Struct2 ( ) {
type Params struct {
Page int ` v:"required|min:1 # page is required" `
Size int ` v:"required|between:1,100 # size is required" `
ProjectId * gvar . Var ` v:"between:1,10000 # project id must between { min}, { max}" `
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
obj := & Params {
Page : 1 ,
Size : 10 ,
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
err := g . Validator ( ) . Data ( obj ) . Run ( gctx . New ( ) )
fmt . Println ( err == nil )
2021-12-05 14:56:34 +08:00
// Output:
2021-12-07 13:49:08 +08:00
// true
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
// Empty integer attribute.
func ExampleValidator_Data_Struct3 ( ) {
type Params struct {
Page int ` v:"required|min:1 # page is required" `
Size int ` v:"required|between:1,100 # size is required" `
ProjectId int ` v:"between:1,10000 # project id must between { min}, { max}" `
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
obj := & Params {
Page : 1 ,
Size : 10 ,
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
err := g . Validator ( ) . Data ( obj ) . Run ( gctx . New ( ) )
fmt . Println ( err )
2021-12-05 14:56:34 +08:00
// Output:
2021-12-07 13:49:08 +08:00
// project id must between 1, 10000
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
func ExampleValidator_Data_Struct4 ( ) {
type User struct {
Name string ` v:"required#请输入用户姓名" `
Type int ` v:"required#请选择用户类型" `
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
data := g . Map {
"name" : "john" ,
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
user := User { }
if err := gconv . Scan ( data , & user ) ; err != nil {
panic ( err )
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
err := g . Validator ( ) . Data ( user ) . Assoc ( data ) . Run ( gctx . New ( ) )
if err != nil {
fmt . Println ( err . Items ( ) )
2021-12-05 14:56:34 +08:00
}
// Output:
2021-12-07 13:49:08 +08:00
// [map[Type:map[required:请选择用户类型]]]
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
func ExampleValidator_Assoc ( ) {
type User struct {
Name string ` v:"required" `
Type int ` v:"required" `
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
data := g . Map {
"name" : "john" ,
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
user := User { }
2021-12-05 14:56:34 +08:00
2021-12-07 13:49:08 +08:00
if err := gconv . Scan ( data , & user ) ; err != nil {
panic ( err )
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
if err := g . Validator ( ) . Data ( user ) . Assoc ( data ) . Run ( context . Background ( ) ) ; err != nil {
2021-12-05 14:56:34 +08:00
fmt . Print ( err )
}
// Output:
2021-12-07 13:49:08 +08:00
// The Type field is required
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
func ExampleValidator_Rules ( ) {
if err := g . Validator ( ) . Data ( 16 ) . Rules ( "min:18" ) . Run ( context . Background ( ) ) ; err != nil {
fmt . Println ( err )
2021-12-05 14:56:34 +08:00
}
// Output:
2021-12-07 13:49:08 +08:00
// The value `16` must be equal or greater than 18
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
func ExampleValidator_Messages ( ) {
if err := g . Validator ( ) . Data ( 16 ) . Rules ( "min:18" ) . Messages ( "Can not regist, Age is less then 18!" ) . Run ( context . Background ( ) ) ; err != nil {
fmt . Println ( err )
2021-12-05 14:56:34 +08:00
}
// Output:
2021-12-07 13:49:08 +08:00
// Can not regist, Age is less then 18!
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
func ExampleValidator_RuleFunc ( ) {
2021-12-05 14:56:34 +08:00
var (
2021-12-07 13:49:08 +08:00
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
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
passErrRuleFunc = func ( ctx context . Context , in gvalid . RuleFuncInput ) error {
pass := in . Value . String ( )
if m := in . Data . Map ( ) ; m [ "data" ] != pass {
return errors . New ( in . Message )
}
return nil
2021-12-05 14:56:34 +08:00
}
)
2021-12-07 13:49:08 +08:00
type LenErrStruct struct {
Value string ` v:"uid@LenErr#Value Length Error!" `
Data string ` p:"data" `
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
st := & LenErrStruct {
Value : "123" ,
Data : "123456" ,
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
// single error sample
if err := g . Validator ( ) . RuleFunc ( lenErrRuleName , lenErrRuleFunc ) . Data ( st ) . Run ( ctx ) ; err != nil {
fmt . Println ( err )
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
type MultiErrorStruct struct {
Value string ` v:"uid@LenErr|PassErr#Value Length Error!|Pass is not Same!" `
Data string ` p:"data" `
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
multi := & MultiErrorStruct {
Value : "123" ,
Data : "123456" ,
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
// multi error sample
if err := g . Validator ( ) . RuleFunc ( lenErrRuleName , lenErrRuleFunc ) . RuleFunc ( passErrRuleName , passErrRuleFunc ) . Data ( multi ) . Run ( ctx ) ; err != nil {
fmt . Println ( err )
2021-12-05 14:56:34 +08:00
}
// Output:
2021-12-07 13:49:08 +08:00
// Value Length Error!
// Value Length Error!; Pass is not Same!
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
func ExampleValidator_RuleFuncMap ( ) {
2021-12-05 14:56:34 +08:00
var (
2021-12-07 13:49:08 +08:00
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
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
passErrRuleFunc = func ( ctx context . Context , in gvalid . RuleFuncInput ) error {
pass := in . Value . String ( )
if m := in . Data . Map ( ) ; m [ "data" ] != pass {
return errors . New ( in . Message )
}
return nil
}
ruleMap = map [ string ] gvalid . RuleFunc {
lenErrRuleName : lenErrRuleFunc ,
passErrRuleName : passErrRuleFunc ,
2021-12-05 14:56:34 +08:00
}
)
2021-12-07 13:49:08 +08:00
type MultiErrorStruct struct {
Value string ` v:"uid@LenErr|PassErr#Value Length Error!|Pass is not Same!" `
Data string ` p:"data" `
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
multi := & MultiErrorStruct {
Value : "123" ,
Data : "123456" ,
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
if err := g . Validator ( ) . RuleFuncMap ( ruleMap ) . Data ( multi ) . Run ( ctx ) ; err != nil {
2021-12-05 14:56:34 +08:00
fmt . Println ( err )
}
// Output:
2021-12-07 13:49:08 +08:00
// Value Length Error!; Pass is not Same!
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
func ExampleValidator_RegisterRule ( ) {
type User struct {
Id int
Name string ` v:"required|unique-name # 请输入用户名称|用户名称已被占用" `
Pass string ` v:"required|length:6,18" `
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
user := & User {
Id : 1 ,
Name : "john" ,
Pass : "123456" ,
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
rule := "unique-name"
gvalid . RegisterRule ( rule , func ( ctx context . Context , in gvalid . RuleFuncInput ) error {
var (
id = in . Data . Val ( ) . ( * User ) . Id
name = gconv . String ( in . Value )
)
n , err := g . Model ( "user" ) . Where ( "id != ? and name = ?" , id , name ) . Count ( )
if err != nil {
return err
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
if n > 0 {
return errors . New ( in . Message )
2021-12-05 14:56:34 +08:00
}
2021-12-07 13:49:08 +08:00
return nil
} )
err := g . Validator ( ) . Data ( user ) . Run ( gctx . New ( ) )
fmt . Println ( err . Error ( ) )
// May Output:
// 用户名称已被占用
2021-11-30 23:48:26 +08:00
}