GoFrame入门教程 GoFrame 数据校验-递归校验

2024-02-25 开发教程 GoFrame入门教程 匿名 2

gvalid​校验组件支持强大的递归校验特性。如果给定的校验数据中的属性或者键值为​struct/map/slice​类型时,将会被自动执行递归校验。我们来看两个示例:

示例1,struct递归校验

package main
import (
"fmt"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gctx"
)
type SearchReq struct {
Key string `v:"required"`
Option SearchOption
}
type SearchOption struct {
Page int `v:"min:1"`
Size int `v:"max:100"`
}
func main() {
var (
ctx = gctx.New()
req = SearchReq{
Key: "GoFrame",
Option: SearchOption{
Page: 1,
Size: 10000,
},
}
)
err := g.Validator().Data(req).Run(ctx)
fmt.Println(err)
}

执行后,终端输出:

The Size value `10000` must be equal or lesser than 100

示例2,slice递归校验

package main
import (
"fmt"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gctx"
)
func main() {
type Student struct {
Name string `v:"required#Student Name is required"`
Age int
}
type Teacher struct {
Name string
Students []Student
}
var (
ctx = gctx.New()
teacher = Teacher{}
data = g.Map{
"name": "john",
"students": `[{"age":2},{"name":"jack", "age":4}]`,
}
)
err := g.Validator().Assoc(data).Data(teacher).Run(ctx)
fmt.Println(err)
}

执行后,终端输出:

Student Name is required

示例3,map递归校验

package main
import (
"fmt"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gctx"
)
func main() {
type Student struct {
Name string `v:"required#Student Name is required"`
Age int
}
type Teacher struct {
Name string
Students map[string]Student
}
var (
ctx = gctx.New()
teacher = Teacher{
Name: "Smith",
Students: map[string]Student{
"john": {Name: "", Age: 18},
},
}
)
err := g.Validator().Data(teacher).Run(ctx)
fmt.Println(err)
}

执行后,终端输出:

Student Name is required