如何在golang中执行有条件的必要验证uzzo ozzo验证?

时间:2017-07-06 01:52:19

标签: validation go

在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),

如果只有在电子邮件不为空的情况下才能添加需要地址的验证?

2 个答案:

答案 0 :(得分:1)

你可以通过两种方式实现它 -

  • 添加您自己的custom rules
  • 根据前置条件值有条件地添加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