ITSkillsCenter
Développement Web

Hooks Go Pocketbase : étendre votre backend en 2026

4 دقائق للقراءة

L’une des forces cachées de Pocketbase est qu’il n’est pas qu’un binaire pré-compilé : c’est aussi un framework Go que vous pouvez étendre avec votre propre code. Cela ouvre des possibilités énormes : intégration avec un service de paiement Mobile Money, calculs complexes, validation métier, logique transactionnelle, intégration WhatsApp Business, agrégations en temps réel. Voici le guide pour utiliser les hooks Go Pocketbase en 2026.

Voir le guide complet Pocketbase pour les bases.

Pourquoi étendre Pocketbase

  • Validation côté serveur impossible via API rules (calculs complexes, dépendance externe)
  • Side-effects après un événement : envoi WhatsApp, déclenchement Mobile Money, notification Slack
  • Endpoints custom HTTP qui ne correspondent pas à une collection
  • Intégration avec services tiers (Wave, Orange Money, OpenAI, etc.)
  • Agrégation de données ou requêtes complexes non exprimables en filter Pocketbase

Étape 1 — Setup projet Go

mkdir mon-pb && cd mon-pb
go mod init mon-pb
go get github.com/pocketbase/pocketbase

# Structure
mon-pb/
├── main.go
├── go.mod
├── go.sum
└── pb_data/   (créé au premier run)

Étape 2 — main.go basique

package main

import (
    "log"
    "github.com/pocketbase/pocketbase"
    "github.com/pocketbase/pocketbase/core"
)

func main() {
    app := pocketbase.New()

    // Hook : avant la création d'un nouveau post
    app.OnRecordCreateRequest("posts").BindFunc(func(e *core.RecordRequestEvent) error {
        title := e.Record.GetString("title")
        if len(title) < 5 {
            return e.BadRequestError("Titre trop court", nil)
        }
        return e.Next()
    })

    // Hook : après création
    app.OnRecordAfterCreateSuccess("posts").BindFunc(func(e *core.RecordEvent) error {
        log.Printf("Post créé: %s", e.Record.GetString("title"))
        // Envoyer notification, indexer dans search, etc.
        return e.Next()
    })

    if err := app.Start(); err != nil {
        log.Fatal(err)
    }
}
# Build et run
go build -o pocketbase
./pocketbase serve --http=0.0.0.0:8090

Étape 3 — Hooks principaux disponibles

  • OnBootstrap : au démarrage de Pocketbase
  • OnRecordCreateRequest("collection"), OnRecordUpdateRequest, OnRecordDeleteRequest : avant validation côté API
  • OnRecordAfterCreateSuccess, OnRecordAfterUpdateSuccess : après écriture en base
  • OnMailerSend : intercepter envoi d’email
  • OnRealtimeMessageSend : intercepter messages WebSocket

Étape 4 — Endpoint HTTP custom

app.OnServe().BindFunc(func(e *core.ServeEvent) error {
    e.Router.GET("/api/stats/dashboard", func(c *core.RequestEvent) error {
        // Compter les posts publiés
        var count int
        err := app.DB().NewQuery("SELECT COUNT(*) FROM posts WHERE published = 1").Row(&count)
        if err != nil {
            return c.InternalServerError("erreur", err)
        }
        return c.JSON(200, map[string]int{"published_posts": count})
    })
    return e.Next()
})

Étape 5 — Cas concret : Mobile Money

Hook qui crée automatiquement une session de paiement Wave quand une commande est créée :

app.OnRecordAfterCreateSuccess("orders").BindFunc(func(e *core.RecordEvent) error {
    amount := e.Record.GetInt("amount")
    orderID := e.Record.Id

    sessionID, paymentURL, err := createWaveSession(amount, orderID)
    if err != nil {
        log.Printf("Wave session error: %v", err)
        return e.Next()
    }

    e.Record.Set("waveSessionId", sessionID)
    e.Record.Set("paymentUrl", paymentURL)
    if err := e.App.Save(e.Record); err != nil {
        return err
    }

    return e.Next()
})

// createWaveSession appelle l'API Wave et retourne sessionID + URL
func createWaveSession(amount int, orderID string) (string, string, error) {
    // Cf. notre tutoriel Wave : itskillscenter.io/api-wave-nodejs-integration-2026/
    // ...
}

Étape 6 — Migrations versionnées

Pour gérer les changements de schéma de manière reproductible (équipe, environnements multiples), utilisez les migrations Pocketbase :

# Générer une migration depuis l'état actuel
./pocketbase migrate collections

# Créer une migration vide pour modifier
./pocketbase migrate create "add_publish_field"

# Appliquer
./pocketbase migrate up

Étape 7 — Compiler et déployer

# Compiler statiquement pour Linux x86_64
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o pocketbase

# Pousser sur Coolify via Git + Dockerfile
# Voir : itskillscenter.io/pocketbase-deployer-coolify-tutoriel/

Adaptation Afrique de l’Ouest

Pocketbase + hooks Go est particulièrement puissant pour les PME ouest-africaines : un seul backend qui gère auth, données métier, et logique de paiement Wave/Orange Money/Free Money. Coût d’hébergement minimum (4 €/mois Hetzner CX22), maintenance réduite, scaling vertical simple.

Erreurs fréquentes

ErreurCauseSolution
Build CGO errorSQLite C dépendancesCGO_ENABLED=0 (Pocketbase utilise modernc/sqlite Go pur)
Hook ne se déclenche pasMauvais nom de collectionVérifier exact case-sensitive
Panic dans hookPas de defer recoverToujours catch errors et returner
Migration casséeConflit entre dashboard et fichierPréférer migrate workflow strict

Pour aller plus loin

Besoin d'un site web ?

Confiez-nous la Création de Votre Site Web

Site vitrine, e-commerce ou application web — nous transformons votre vision en réalité digitale. Accompagnement personnalisé de A à Z.

À partir de 250.000 FCFA
Parlons de Votre Projet
Publicité