Maison  >  Article  >  développement back-end  >  La validation avec ozzo n'appelle pas la méthode de validation de la structure embarquée

La validation avec ozzo n'appelle pas la méthode de validation de la structure embarquée

王林
王林avant
2024-02-13 13:30:101175parcourir

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

L'éditeur php Yuzai a découvert que la vérification des données peut être facilement réalisée à l'aide de la bibliothèque de vérification ozzo, mais vous pouvez parfois rencontrer des situations où vous devez appeler la méthode de vérification de la structure intégrée. Cependant, le principe de conception de la bibliothèque de validation ozzo est d'éviter d'appeler des méthodes de validation intégrées dans des structures pour garantir la simplicité et la lisibilité du code. En effet, la méthode de vérification intégrée à la structure peut compliquer la logique de vérification et augmenter la difficulté de maintenance du code. Par conséquent, lorsque nous utilisons la bibliothèque de vérification ozzo, nous devons suivre ce principe et choisir une méthode de vérification appropriée pour garder le code clair et facile à maintenir.

Contenu de la question

J'utilise "github.com/go-ozzo/ozzo-validation/v4". Voici mes structures :

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

Voici les méthodes de vérification :

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
}

Voici la demande que j'ai envoyée :

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

Je veux appeler func (m mystruct) validate() pour ce problème, mais je ne reçois pas le journal appelant myotherstruct validateur. func (m mystruct) validate(),但我没有收到日志 calling myotherstruct validator

解决方法

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

Solution de contournement

Le code source dans la question avec ozzo validation v4 renvoie le champ n°0 introuvable dans la structure. En plus de cela, vous devez ajouter le code suivant à (myotherstruct).validate :

validation.field(&m.mystruct),

Essayez cette démo ((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())
}
🎜Veuillez noter que si vous appelez 🎜, vous ne savez rien. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer