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

Mengesahkan dengan ozzo tidak memanggil kaedah pengesahan struktur terbenam

王林
Lepaskan: 2024-02-13 13:30:10
ke hadapan
1244 orang telah melayarinya

使用 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"`
}
Salin selepas log masuk

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
}
Salin selepas log masuk

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
}
Salin selepas log masuk

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),
Salin selepas log masuk

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())
}
Salin selepas log masuk
🎜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!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan