github.com/gogf/gf@v1.16.9/util/gvalid/gvalid_z_example_test.go (about) 1 // Copyright GoFrame Author(https://goframe.org). All Rights Reserved. 2 // 3 // This Source Code Form is subject to the terms of the MIT License. 4 // If a copy of the MIT was not distributed with this file, 5 // You can obtain one at https://github.com/gogf/gf. 6 7 package gvalid_test 8 9 import ( 10 "context" 11 "errors" 12 "fmt" 13 "math" 14 "reflect" 15 16 "github.com/gogf/gf/container/gvar" 17 "github.com/gogf/gf/frame/g" 18 "github.com/gogf/gf/util/gconv" 19 "github.com/gogf/gf/util/gvalid" 20 ) 21 22 func ExampleCheckMap() { 23 params := map[string]interface{}{ 24 "passport": "", 25 "password": "123456", 26 "password2": "1234567", 27 } 28 rules := []string{ 29 "passport@required|length:6,16#账号不能为空|账号长度应当在:min到:max之间", 30 "password@required|length:6,16|same:password2#密码不能为空|密码长度应当在:min到:max之间|两次密码输入不相等", 31 "password2@required|length:6,16#", 32 } 33 if e := gvalid.CheckMap(context.TODO(), params, rules); e != nil { 34 fmt.Println(e.Map()) 35 fmt.Println(e.FirstItem()) 36 fmt.Println(e.FirstString()) 37 } 38 // May Output: 39 // map[required:账号不能为空 length:账号长度应当在6到16之间] 40 // passport map[required:账号不能为空 length:账号长度应当在6到16之间] 41 // 账号不能为空 42 } 43 44 func ExampleCheckMap2() { 45 params := map[string]interface{}{ 46 "passport": "", 47 "password": "123456", 48 "password2": "1234567", 49 } 50 rules := []string{ 51 "passport@length:6,16#账号不能为空|账号长度应当在:min到:max之间", 52 "password@required|length:6,16|same:password2#密码不能为空|密码长度应当在:min到:max之间|两次密码输入不相等", 53 "password2@required|length:6,16#", 54 } 55 if e := gvalid.CheckMap(context.TODO(), params, rules); e != nil { 56 fmt.Println(e.Map()) 57 fmt.Println(e.FirstItem()) 58 fmt.Println(e.FirstString()) 59 } 60 // Output: 61 // map[same:两次密码输入不相等] 62 // password map[same:两次密码输入不相等] 63 // 两次密码输入不相等 64 } 65 66 // Empty string attribute. 67 func ExampleCheckStruct() { 68 type Params struct { 69 Page int `v:"required|min:1 # page is required"` 70 Size int `v:"required|between:1,100 # size is required"` 71 ProjectId string `v:"between:1,10000 # project id must between :min, :max"` 72 } 73 obj := &Params{ 74 Page: 1, 75 Size: 10, 76 } 77 err := gvalid.CheckStruct(context.TODO(), obj, nil) 78 fmt.Println(err == nil) 79 // Output: 80 // true 81 } 82 83 // Empty pointer attribute. 84 func ExampleCheckStruct2() { 85 type Params struct { 86 Page int `v:"required|min:1 # page is required"` 87 Size int `v:"required|between:1,100 # size is required"` 88 ProjectId *gvar.Var `v:"between:1,10000 # project id must between :min, :max"` 89 } 90 obj := &Params{ 91 Page: 1, 92 Size: 10, 93 } 94 err := gvalid.CheckStruct(context.TODO(), obj, nil) 95 fmt.Println(err == nil) 96 // Output: 97 // true 98 } 99 100 // Empty integer attribute. 101 func ExampleCheckStruct3() { 102 type Params struct { 103 Page int `v:"required|min:1 # page is required"` 104 Size int `v:"required|between:1,100 # size is required"` 105 ProjectId int `v:"between:1,10000 # project id must between :min, :max"` 106 } 107 obj := &Params{ 108 Page: 1, 109 Size: 10, 110 } 111 err := gvalid.CheckStruct(context.TODO(), obj, nil) 112 fmt.Println(err) 113 // Output: 114 // project id must between 1, 10000 115 } 116 117 func ExampleRegisterRule() { 118 type User struct { 119 Id int 120 Name string `v:"required|unique-name # 请输入用户名称|用户名称已被占用"` 121 Pass string `v:"required|length:6,18"` 122 } 123 user := &User{ 124 Id: 1, 125 Name: "john", 126 Pass: "123456", 127 } 128 129 rule := "unique-name" 130 gvalid.RegisterRule(rule, func(ctx context.Context, rule string, value interface{}, message string, data interface{}) error { 131 var ( 132 id = data.(*User).Id 133 name = gconv.String(value) 134 ) 135 n, err := g.Model("user").Where("id != ? and name = ?", id, name).Count() 136 if err != nil { 137 return err 138 } 139 if n > 0 { 140 return errors.New(message) 141 } 142 return nil 143 }) 144 err := gvalid.CheckStruct(context.TODO(), user, nil) 145 fmt.Println(err.Error()) 146 // May Output: 147 // 用户名称已被占用 148 } 149 150 func ExampleRegisterRule_OverwriteRequired() { 151 rule := "required" 152 gvalid.RegisterRule(rule, func(ctx context.Context, rule string, value interface{}, message string, data interface{}) error { 153 reflectValue := reflect.ValueOf(value) 154 if reflectValue.Kind() == reflect.Ptr { 155 reflectValue = reflectValue.Elem() 156 } 157 isEmpty := false 158 switch reflectValue.Kind() { 159 case reflect.Bool: 160 isEmpty = !reflectValue.Bool() 161 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: 162 isEmpty = reflectValue.Int() == 0 163 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: 164 isEmpty = reflectValue.Uint() == 0 165 case reflect.Float32, reflect.Float64: 166 isEmpty = math.Float64bits(reflectValue.Float()) == 0 167 case reflect.Complex64, reflect.Complex128: 168 c := reflectValue.Complex() 169 isEmpty = math.Float64bits(real(c)) == 0 && math.Float64bits(imag(c)) == 0 170 case reflect.String, reflect.Map, reflect.Array, reflect.Slice: 171 isEmpty = reflectValue.Len() == 0 172 } 173 if isEmpty { 174 return errors.New(message) 175 } 176 return nil 177 }) 178 fmt.Println(gvalid.CheckValue(context.TODO(), "", "required", "It's required")) 179 fmt.Println(gvalid.CheckValue(context.TODO(), 0, "required", "It's required")) 180 fmt.Println(gvalid.CheckValue(context.TODO(), false, "required", "It's required")) 181 gvalid.DeleteRule(rule) 182 fmt.Println("rule deleted") 183 fmt.Println(gvalid.CheckValue(context.TODO(), "", "required", "It's required")) 184 fmt.Println(gvalid.CheckValue(context.TODO(), 0, "required", "It's required")) 185 fmt.Println(gvalid.CheckValue(context.TODO(), false, "required", "It's required")) 186 // Output: 187 // It's required 188 // It's required 189 // It's required 190 // rule deleted 191 // It's required 192 // <nil> 193 // <nil> 194 } 195 196 func ExampleValidator_Rules() { 197 data := g.Map{ 198 "password": "123", 199 } 200 err := g.Validator().Data(data).Rules("required-with:password").Messages("请输入确认密码").CheckValue("") 201 fmt.Println(err.String()) 202 203 // Output: 204 // 请输入确认密码 205 } 206 207 func ExampleValidator_CheckValue() { 208 err := g.Validator().Rules("min:18").Messages("未成年人不允许注册哟").CheckValue(16) 209 fmt.Println(err.String()) 210 211 // Output: 212 // 未成年人不允许注册哟 213 } 214 215 func ExampleValidator_CheckMap() { 216 params := map[string]interface{}{ 217 "passport": "", 218 "password": "123456", 219 "password2": "1234567", 220 } 221 rules := map[string]string{ 222 "passport": "required|length:6,16", 223 "password": "required|length:6,16|same:password2", 224 "password2": "required|length:6,16", 225 } 226 messages := map[string]interface{}{ 227 "passport": "账号不能为空|账号长度应当在:min到:max之间", 228 "password": map[string]string{ 229 "required": "密码不能为空", 230 "same": "两次密码输入不相等", 231 }, 232 } 233 err := g.Validator().Messages(messages).Rules(rules).CheckMap(params) 234 if err != nil { 235 g.Dump(err.Maps()) 236 } 237 238 // May Output: 239 //{ 240 // "passport": { 241 // "length": "账号长度应当在6到16之间", 242 // "required": "账号不能为空" 243 //}, 244 // "password": { 245 // "same": "两次密码输入不相等" 246 //} 247 //} 248 } 249 250 func ExampleValidator_CheckStruct() { 251 type User struct { 252 Name string `v:"required#请输入用户姓名"` 253 Type int `v:"required#请选择用户类型"` 254 } 255 data := g.Map{ 256 "name": "john", 257 } 258 user := User{} 259 if err := gconv.Scan(data, &user); err != nil { 260 panic(err) 261 } 262 err := g.Validator().Data(data).CheckStruct(user) 263 if err != nil { 264 fmt.Println(err.Items()) 265 } 266 267 // Output: 268 // [map[Type:map[required:请选择用户类型]]] 269 }