editor php Yuzai mendapati bahawa pengesahan data boleh dicapai dengan mudah menggunakan perpustakaan pengesahan ozzo, tetapi kadangkala anda mungkin menghadapi situasi di mana anda perlu menghubungi kaedah pengesahan struktur terbenam. Walau bagaimanapun, prinsip reka bentuk perpustakaan pengesahan ozzo adalah untuk mengelakkan memanggil kaedah pengesahan yang tertanam dalam struktur untuk memastikan kesederhanaan dan kebolehbacaan kod. Ini kerana kaedah pengesahan yang tertanam dalam struktur mungkin merumitkan logik pengesahan dan meningkatkan kesukaran penyelenggaraan kod. Oleh itu, apabila menggunakan perpustakaan pengesahan ozzo, kita harus mengikut prinsip ini dan memilih kaedah pengesahan yang sesuai untuk memastikan kod tersebut jelas dan mudah diselenggara.
Saya menggunakan "github.com/go-ozzo/ozzo-validation/v4"
.
Ini adalah struktur saya:
type mystruct struct { uuid string `json:"uuid"` firstuuid string `json:"first_uuid"` seconduuid string `json:"second_uuid"` thirduuid string `json:"third_uuid"` phonenumber string `json:"phone_number"` email string `json:"email"` skypeid string `json:"skype_id"` } type myotherstruct struct { mystruct city string `json:"city"` comment string `json:"comment"` personnelid string `json:"personnel_id"` firstdate string `json:"first_date"` seconddate string `json:"second_date"` firstboolean bool `json:"first_boolean"` secondboolean bool `json:"second_boolean"` }
Ini adalah kaedah pengesahan:
func (m mystruct) validate() error { fmt.println("calling mystruct validator") err := validation.validatestruct( validation.field(&uui.uuid, is.uuid), validation.field(&uui.firstuuid, validation.required, is.uuid), validation.field(&uui.seconduuid, validation.required, is.uuid), validation.field(&uui.thirduuid, validation.required, is.uuid), validation.field(&uui.email, validation.required, is.email), validation.field(&uui.phonenumber, validation.required, validation.match(mobileregexp)), validation.field(&uui.skypeid, validation.required), ) return err } func (m myotherstruct) validate() error { fmt.println("calling myotherstruct validator") err := validation.validatestruct( validation.field(&uui.personnelid, validation.match(personnelidregexp)), validation.field(&uui.city, validation.required), validation.field(&uui.comment), validation.field(&uui.firstdate, validation.date(time.dateonly)), validation.field(&uui.seconddate, validation.date(time.dateonly)), ) return err }
Ini adalah permintaan yang saya hantar:
{ "uuid": "1e57ef49-352f-4545-a43a-b51cad6c5a0a", "phone_number": "09124567891", "email": "[email protected]", "skype_id": "some_skype_id", "city": "a city", "personnel_id": "", "comment": "no comment for now!", "first_date": "", "second_date": "", "first_uuid": "94038913-2bdb-4dde-99fb-640a24e1c003", "second_uuid": "7fa0e242-841b-4de0-a3ce-e2b54ecd1bca", "third_uuid": "35ab6711-852e-42c8-aab3-dfb901a845f5", "first_boolean": true, "second_boolean": false }
Saya mahu memanggil func (m mystruct) validate()
untuk masalah ini, tetapi saya tidak mendapat log calling myotherstruct validator
. func (m mystruct) validate()
,但我没有收到日志 calling myotherstruct validator
。
问题中的源代码与ozzo 验证 v4 返回在结构中找不到字段 #0。除此之外,您应该将以下代码添加到 (myotherstruct).validate
Kod sumber dalam soalan dengan pengesahan ozzo v4 mengembalikan medan #0 tidak ditemui dalam struktur. Di samping itu, anda harus menambah kod berikut pada (myotherstruct).validate
:
validation.field(&m.mystruct),
Cuba demo ini ((mystruct).validate
,则 (myotherstruct).validate
不会被调用,因为前者对 myotherstruct
//m.sbmmt.com/link/9f29450d2eb58feb555078bdefe28aa5
package main import ( "fmt" validation "github.com/go-ozzo/ozzo-validation/v4" "github.com/go-ozzo/ozzo-validation/v4/is" ) type MyStruct struct { UUID string `json:"uuid"` Email string `json:"email"` } func (m MyStruct) Validate() error { fmt.Println("calling MyStruct validator") err := validation.ValidateStruct( &m, validation.Field(&m.UUID, is.UUID), validation.Field(&m.Email, validation.Required, is.Email), ) return err } type MyOtherStruct struct { MyStruct City string `json:"city"` } func (m MyOtherStruct) Validate() error { fmt.Println("calling MyOtherStruct validator") err := validation.ValidateStruct( &m, validation.Field(&m.City, validation.Required), // The following line is necessary to make (MyStruct).Validate being called. validation.Field(&m.MyStruct), ) return err } func main() { data := MyOtherStruct{} fmt.Printf("validation error: %v\n", data.Validate()) }
Atas ialah kandungan terperinci Mengesahkan dengan ozzo tidak memanggil kaedah pengesahan struktur terbenam. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!