Heim  >  Artikel  >  Backend-Entwicklung  >  Bei der Validierung mit ozzo wird nicht die Validierungsmethode der eingebetteten Struktur aufgerufen

Bei der Validierung mit ozzo wird nicht die Validierungsmethode der eingebetteten Struktur aufgerufen

王林
王林nach vorne
2024-02-13 13:30:101175Durchsuche

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

php-Editor Yuzai stellte fest, dass die Datenüberprüfung mithilfe der Ozzo-Überprüfungsbibliothek leicht durchgeführt werden kann. Manchmal kann es jedoch vorkommen, dass Sie die Überprüfungsmethode der eingebetteten Struktur aufrufen müssen. Das Designprinzip der Ozzo-Validierungsbibliothek besteht jedoch darin, den Aufruf von in Strukturen eingebetteten Validierungsmethoden zu vermeiden, um die Einfachheit und Lesbarkeit des Codes sicherzustellen. Dies liegt daran, dass die in die Struktur eingebettete Verifizierungsmethode die Verifizierungslogik komplizieren und die Codewartung erschweren kann. Daher sollten wir bei der Verwendung der Ozzo-Verifizierungsbibliothek diesem Prinzip folgen und eine geeignete Verifizierungsmethode auswählen, um den Code klar und leicht zu warten zu halten.

Frageninhalt

Ich verwende "github.com/go-ozzo/ozzo-validation/v4". Das sind meine Strukturen:

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

Dies sind die Verifizierungsmethoden:

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
}

Das ist die Anfrage, die ich gesendet habe:

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

Ich möchte func (m mystruct)validate() für dieses Problem aufrufen, aber ich erhalte nicht das Protokoll calling myotherstruct validator. func (m mystruct) validate(),但我没有收到日志 calling myotherstruct validator

解决方法

问题中的源代码与ozzo 验证 v4 返回在结构中找不到字段 #0。除此之外,您应该将以下代码添加到 (myotherstruct).validate

Problemumgehung

Der Quellcode in der Frage mit ozzo validation v4 gibt Feld Nr. 0 zurück, das nicht in der Struktur gefunden wurde. Darüber hinaus sollten Sie den folgenden Code zu (myotherstruct).validate hinzufügen:

validation.field(&m.mystruct),

Probieren Sie diese Demo aus ((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())
}
🎜Bitte beachten Sie, dass Sie nichts wissen, wenn Sie anrufen 🎜. 🎜

Das obige ist der detaillierte Inhalt vonBei der Validierung mit ozzo wird nicht die Validierungsmethode der eingebetteten Struktur aufgerufen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen