Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Isu dengan kombinasi required_if dalam pakej github.com/go-playground/validator/v10

Isu dengan kombinasi required_if dalam pakej github.com/go-playground/validator/v10

WBOY
WBOYke hadapan
2024-02-11 11:54:08455semak imbas

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

editor php Baicao ada di sini untuk memperkenalkan kepada anda soalan tentang gabungan diperlukan_jika dalam pakej github.com/go-playground/validator/v10. Apabila menggunakan pakej ini untuk pengesahan data, kadangkala kita perlu menentukan sama ada medan lain diperlukan berdasarkan nilai medan tertentu. Pada masa ini, anda boleh menggunakan peraturan gabungan required_if untuk mencapai keperluan ini. Ia boleh menentukan sama ada sesuatu medan diperlukan berdasarkan syarat yang ditetapkan, yang sangat fleksibel dan praktikal. Dalam artikel ini, kami akan memperincikan cara menggunakan peraturan gabungan required_if untuk menyelesaikan masalah ini.

Kandungan soalan

Versi pakej, cth. v9, v10:

Versi pakej: v10

Soalan, isu atau penambahbaikan: Apabila saya cuba menjalankan kod di bawah. Saya mendapat ralat ini dan ia berwayar

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

Contoh kod untuk demonstrasi atau pengeluaran semula:

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")
    }
}

Tidak dapat mengetahui masalah dalam kod atau pakej pengesahan. Sebarang bantuan amatlah dihargai...

Penyelesaian

Tambah omitempty Contohnya:

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"`
}
Contoh penuh dalam

taman permainan (perhatikan bahawa ini tidak akan berjalan dengan pasti di Taman Permainan kerana saiz bilangan pakej yang diimport).

Masalahnya ialah required_if menyebabkan pustaka menyemak sama ada Orang//Entiti wujud, tetapi perpustakaan masih mengesahkan kosong Orang /Entiti (dan gagal!). Menambah required_if 导致库检查 Person//Entity 是否存在,但库仍会验证空的 Person/Entity (并且失败!)。添加 omitempty 意味着库将忽略空的 struct;这提供了所需的结果,因为 required_if 将确保任何必需的 struct bermakna perpustakaan akan mengabaikan struct kosong ini memberikan hasil yang diingini kerana required_if akan memastikan bahawa sebarang struct yang diperlukan tidak Kosong (bermaksud ia akan disahkan).

Pilihan lain ialah menggunakan penunjuk (taman permainan):

type Applicant struct {
    ApplicantCategory string `validate:"required,oneof=PERSON ENTITY"`
    Person            *Person `validate:"required_if=ApplicantCategory PERSON"`
    Entity            *Entity `validate:"required_if=ApplicantCategory ENTITY"`
}

Perbezaannya di sini ialah pengesahan tidak boleh dilakukan tanpa Entity 时,该值将为 nil (与具有默认值的 Entity 相反),这意味着 validator.

Nota: Saya mengesyorkan menggunakan v := validator.New(validator.WithRequiredStructEnabled()) (mengikut dokumentasi).

Atas ialah kandungan terperinci Isu dengan kombinasi required_if dalam pakej github.com/go-playground/validator/v10. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam