在Golang ozzo-validation中,如何验证依赖于另一个字段的字段?
例如,如果我有以下内容:
return validation.ValidateStruct(&c, validation.Field(&c.Name, validation.Required, validation.Length(5, 20)), validation.Field(&c.Gender, validation.In("Female", "Male")), validation.Field(&c.Email, is.Email), validation.Field(&c.Address),
如果只有在电子邮件不为空的情况下才能添加需要地址的验证?
答案 0 :(得分:1)
你可以通过两种方式实现它 -
FieldRules
,即在创建字段规则时检查Email
,然后将其提供给validation.ValidateStruct
例如:
type Sample struct {
Name string
Gender string
Email string
Address Address
}
type Address struct {
// ... fields
}
func (s Sample) Validate() error {
var fieldRules []*validation.FieldRules
fieldRules = append(fieldRules, validation.Field(&s.Name, validation.Required, validation.Length(5, 20)))
fieldRules = append(fieldRules, validation.Field(&s.Gender, validation.In("Female", "Male")))
fieldRules = append(fieldRules, validation.Field(&s.Email, is.Email))
if len(strings.TrimSpace(s.Email)) > 0 {
fieldRules = append(fieldRules, validation.Field(&s.Address, validation.Required))
fieldRules = append(fieldRules, validation.Field(&s.Address))
}
return validation.ValidateStruct(&s, fieldRules...)
}
答案 1 :(得分:1)
该库现在支持通过 validation.When
函数进行条件验证。
这是一段符合您描述的验证的代码。
package main
import (
"fmt"
validation "github.com/go-ozzo/ozzo-validation" // or "github.com/go-ozzo/ozzo-validation/v4" if "When" not found
)
type Entry struct {
Name string
Gender string
Email string
Address string
}
func main() {
v := func(e Entry) {
fmt.Println(validation.ValidateStruct(&e,
validation.Field(&e.Name, validation.Required, validation.Length(5, 20)),
// Note that if gender is "" and not required, validation returns no error.
validation.Field(&e.Gender, validation.Required, validation.In("Female", "Male")),
validation.Field(&e.Address, validation.When(e.Email != "", validation.Required.Error("Address is required if Email is set"))),
))
}
// All is fine for no Email.
e := Entry{
Name: "My name is!",
Gender: "Male",
}
v(e)
// Validation fails for Email and no Address.
e = Entry{
Name: "My name is!",
Gender: "Male",
Email: "a@org.com",
}
v(e)
}
它输出。
<nil>
Address: Address is required if Email is set.
图书馆文档也对其进行了描述:https://github.com/go-ozzo/ozzo-validation#conditional-validation