php editor Baicao is here to introduce to you a question about the required_if combination in the github.com/go-playground/validator/v10 package. When using this package for data validation, sometimes we need to determine whether other fields are required based on the value of a certain field. At this time, you can use the required_if combination rule to achieve this requirement. It can determine whether a field is required based on specified conditions, which is very flexible and practical. In this article, we will detail how to use required_if combination rules to solve this problem.
Software package version, for example. v9, v10:
Package version: v10
Questions, problems or improvements: When I try to run the code below. I'm getting this error, it's wired
Output
Validation error: Key: 'Application.Applicants[0].Entity.Name' Error:Field validation for 'Name' failed on the 'required' tag Key: 'Application.Applicants[0].Entity.TaxID' Error:Field validation for 'TaxID' failed on the 'required' tag Key: 'Application.Applicants[1].Person.Name' Error:Field validation for 'Name' failed on the 'required' tag Key: 'Application.Applicants[1].Person.Age' Error:Field validation for 'Age' failed on the 'required' tag Key: 'Application.Applicants[1].Person.Email' Error:Field validation for 'Email' failed on the 'required' tag
Code examples for demonstration or reproduction:
package main import ( "fmt" "github.com/go-playground/validator/v10" ) type Application struct { Applicants []Applicant `validate:"dive"` } type Applicant struct { ApplicantCategory string `validate:"required,oneof=PERSON ENTITY"` Person Person `validate:"required_if=ApplicantCategory PERSON"` Entity Entity `validate:"required_if=ApplicantCategory ENTITY"` } type Person struct { Name string `validate:"required"` Age int `validate:"required,gte=18"` Email string `validate:"required,email"` } type Entity struct { Name string `validate:"required"` TaxID string `validate:"required"` } func main() { // Create a new validator instance v := validator.New() // Create an instance of Application to validate data := Application{ Applicants: []Applicant{ { ApplicantCategory: "PERSON", Person: Person{ Name: "John Doe", Age: 25, Email: "[email protected]", }, }, { ApplicantCategory: "ENTITY", Entity: Entity{ Name: "Example Corp", TaxID: "123456789", }, }, }, } // Use the validator to validate the Application struct and its Applicants if err := v.Struct(data); err != nil { fmt.Println("Validation error:", err) } else { fmt.Println("Validation passed") } }
Unable to identify a problem in the code or validation package. Any help would be greatly appreciated...
Add omitempty
For example: < /p>
type Applicant struct { ApplicantCategory string `validate:"required,oneof=PERSON ENTITY"` Person Person `validate:"required_if=ApplicantCategory PERSON,omitempty"` Entity Entity `validate:"required_if=ApplicantCategory ENTITY,omitempty"` }
playground (note that this will not run reliably in the Playground due to the size of the number of imported packages).
The problem is that required_if
causes the library to check if Person
//Entity
exists, but the library still validates an empty Person
/Entity
(and fails!). Adding omitempty
means that the library will ignore empty struct
; this provides the desired result because required_if
will ensure that any required struct
Not empty (meaning it will be validated).
Another option is to use pointers (playground):
type Applicant struct { ApplicantCategory string `validate:"required,oneof=PERSON ENTITY"` Person *Person `validate:"required_if=ApplicantCategory PERSON"` Entity *Entity `validate:"required_if=ApplicantCategory ENTITY"` }
The difference here is that when there is no Entity
, the value will be nil
(as opposed to Entity
which has a default value), which means validator
Unable to verify.
Note: I recommend using v := validator.New(validator.WithRequiredStructEnabled())
(as per documentation).
The above is the detailed content of Issue with required_if combination in github.com/go-playground/validator/v10 package. For more information, please follow other related articles on the PHP Chinese website!