Maison > Article > développement back-end > Problème avec la combinaison require_if dans le package github.com/go-playground/validator/v10
l'éditeur php Baicao est là pour vous présenter une question sur la combinaison requirejse_if dans le package github.com/go-playground/validator/v10. Lors de l'utilisation de ce package pour la validation des données, nous devons parfois déterminer si d'autres champs sont requis en fonction de la valeur d'un certain champ. À ce stade, vous pouvez utiliser la règle de combinaison require_if pour répondre à cette exigence. Il peut déterminer si un champ est requis en fonction de conditions spécifiées, ce qui est très flexible et pratique. Dans cet article, nous détaillerons comment utiliser les règles de combinaison require_if pour résoudre ce problème.
Version du package, par exemple. v9, v10 :
Version du package : v10
Questions, problèmes ou améliorations : Quand j'essaie d'exécuter le code ci-dessous. Je reçois cette erreur et c'est câblé
Sortie
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
Exemples de codes pour démonstration ou 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") } }
Impossible de comprendre le problème dans le code ou le package de validation. Toute aide serait grandement appréciée...
Ajouter omitempty
Par exemple :
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"` }Exemple complet dans
playground (notez que cela ne fonctionnera pas de manière fiable dans Playground en raison de la taille du nombre de packages importés).
Le problème est que required_if
amène la bibliothèque à vérifier si Person
//Entity
existe, mais la bibliothèque valide toujours un vide Personne
/Entité
(et échoue !). L'ajout de required_if
导致库检查 Person
//Entity
是否存在,但库仍会验证空的 Person
/Entity
(并且失败!)。添加 omitempty
意味着库将忽略空的 struct
;这提供了所需的结果,因为 required_if
将确保任何必需的 struct
signifie que la bibliothèque ignorera les struct
vides ; cela fournit le résultat souhaité car required_if
garantira que tout struct
requis n'est pas vide (ce qui signifie il sera validé).
Une autre option consiste à utiliser des pointeurs (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"` }
La différence ici est que la validation n'est pas possible sans Entity
时,该值将为 nil
(与具有默认值的 Entity
相反),这意味着 validator
.
Remarque : je recommande d'utiliser v := validator.New(validator.WithRequiredStructEnabled())
(selon la documentation).
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!