Maison  >  Article  >  développement back-end  >  Problème avec la combinaison require_if dans le package github.com/go-playground/validator/v10

Problème avec la combinaison require_if dans le package github.com/go-playground/validator/v10

WBOY
WBOYavant
2024-02-11 11:54:08468parcourir

github.com/go-playground/validator/v10 包中的 required_if 组合问题

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.

Contenu de la question

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...

Solution de contournement

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer