Rumah >pembangunan bahagian belakang >Golang >Mengesahkan dengan ozzo tidak memanggil kaedah pengesahan struktur terbenam

Mengesahkan dengan ozzo tidak memanggil kaedah pengesahan struktur terbenam

王林
王林ke hadapan
2024-02-13 13:30:101254semak imbas

使用 ozzo 验证不会调用嵌入结构的验证方法

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.

Kandungan soalan

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

Penyelesaian

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 不会被调用,因为前者对 myotherstructhttps://www.php.cn/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())
}
🎜Sila ambil perhatian bahawa jika anda menghubungi 🎜 anda tidak tahu apa-apa. 🎜

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!

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