Go Academy · Leçon

Hooks et portées

Personnaliser les requêtes

Leçon 4 sur 413 étapes

Hooks et portées est une leçon Go Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Go Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Go Academy comprend 4 leçons au total.

Points d'extension et portées

GORM propose deux outils de personnalisation : les points d'extension exécutent automatiquement du code autour des événements du cycle de vie, tandis que les portées regroupent une logique de requête réutilisable. Ensemble, ils rendent l'accès aux données clair et cohérent.

Que sont les points d'extension

Les points d'extension sont des méthodes de votre modèle que GORM appelle avant ou après une opération : BeforeCreate, AfterCreate, BeforeUpdate, BeforeDelete, entre autres.

Un point d'extension BeforeCreate

Définissez une méthode ayant la signature appropriée sur le modèle. Ici, nous définissons un UUID avant l'insertion de l'enregistrement.

func (u *User) BeforeCreate(tx *gorm.DB) error {
    u.UUID = uuid.NewString()
    return nil
}

Validation dans les points d'extension

Renvoyez une erreur depuis un point d'extension pour interrompre l'opération. GORM annule la transaction environnante, de sorte que les données invalides n'atteignent jamais la base de données.

func (u *User) BeforeSave(tx *gorm.DB) error {
    if u.Age < 0 {
        return errors.New("age cannot be negative")
    }
    return nil
}

Les points d'extension s'exécutent dans une transaction

L'argument tx *gorm.DB est la transaction utilisée par GORM. Si vous écrivez des données associées dans un point d'extension, utilisez ce tx afin que ces données soient validées ou annulées atomiquement avec l'opération principale.

Que sont les portées

Une portée est une fonction qui reçoit et renvoie un *gorm.DB, encapsulant un fragment de requête. Vous l’appliquez avec db.Scopes(...) et la réutilisez dans de nombreuses requêtes.

func ActiveUsers(db *gorm.DB) *gorm.DB {
    return db.Where("active = ?", true)
}

Appliquer des portées

Transmettez une ou plusieurs portées à Scopes. Elles se composent entre elles, ce qui vous permet de combiner des filtres de manière déclarative pour obtenir une requête finale.

db.Scopes(ActiveUsers, Recent).Find(&users)

Simulation exécutable d’un point d’accroche et d’une portée

GORM a besoin d’une base de données. Cet exemple exécutable simule donc un point d’accroche BeforeCreate et un filtre réutilisable similaire à une portée, à l’aide de fonctions simples.

package main

import (
    "errors"
    "fmt"
)

type User struct {
    Name   string
    Age    int
    Active bool
}

func beforeCreate(u *User) error {
    if u.Age < 0 {
        return errors.New("age cannot be negative")
    }
    if u.Name == "" {
        u.Name = "anonymous"
    }
    return nil
}

func activeOnly(users []User) []User {
    var out []User
    for _, u := range users {
        if u.Active {
            out = append(out, u)
        }
    }
    return out
}

func main() {
    u := User{Age: 30, Active: true}
    if err := beforeCreate(&u); err != nil {
        fmt.Println("error:", err)
        return
    }
    fmt.Println("created:", u.Name)
    all := []User{u, {Name: "Lin", Active: false}}
    fmt.Println("active count:", len(activeOnly(all)))
}

Portées pour la pagination

Une portée courante génère la pagination à partir d’un numéro de page et encapsule Offset et Limit, afin que chaque point d’accès de liste utilise la pagination de la même manière.

func Paginate(page, size int) func(*gorm.DB) *gorm.DB {
    return func(db *gorm.DB) *gorm.DB {
        return db.Offset((page - 1) * size).Limit(size)
    }
}

Points d’accroche ou logique applicative

Les points d’accroche centralisent les préoccupations transversales comme les horodatages, les identifiants lisibles et les champs d’audit. Gardez la logique métier complexe dans les services, et non dans les points d’accroche, afin que le comportement reste prévisible et facile à vérifier.

Ignorer les points d’accroche

Pour les opérations en masse, vous pouvez désactiver les points d’accroche avec db.Session(&gorm.Session{SkipHooks: true}). Cela accélère les importations volumineuses, mais ignore vos validations : utilisez donc cette possibilité avec prudence.

Vérification rapide

Vérifiez vos connaissances sur les points d’accroche et les portées.

Récapitulatif

Vous avez appris à utiliser les points d’accroche et les portées :

  • Les points d’accroche s’exécutent autour des événements du cycle de vie ; renvoyer une erreur interrompt l’opération et annule la transaction
  • Les points d’accroche s’exécutent dans la transaction via l’argument tx
  • Les portées sont des fonctions réutilisables de type *gorm.DB, appliquées avec Scopes
  • Utilisez les portées pour les filtres et la pagination
  • SkipHooks contourne les points d’accroche pour les opérations en masse
Gratuit pour commencer

Apprends Go avec un tuteur IA — gratuit

Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.

Cours
51
Leçons
203

Questions Fréquemment Posées

La leçon « Hooks et portées » est-elle gratuite ?

Oui — le texte complet de « Hooks et portées » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Go Academy, passe à CoddyKit PRO. Le cours Go Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Hooks et portées » ?

Personnaliser les requêtes Tu pratiques Go Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Go Academy ?

Aucune expérience préalable n'est requise. Go Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « Hooks et portées » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Go Academy ?

Oui. Chaque leçon Go Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Modèles et AutoMigrate
  2. Opérations CRUD
  3. Associations
  4. Hooks et portées
← Retour à Go Academy