Rumah > Artikel > pembangunan bahagian belakang > Isu dengan kombinasi required_if dalam pakej github.com/go-playground/validator/v10
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.
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...
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!