Hooks transactionnels
Validez une écriture et planifiez ses effets avec la transaction métier.
Sur cette page
beforeContentSave et contentSaved
beforeContentSave(entry, context) s’exécute avant l’écriture ; contentSaved s’exécute après l’écriture métier, dans la même transaction et avant commit. Ils s’appliquent aussi aux publications planifiées. entry est une copie en lecture seule du contenu validé.
context.failValidation(message) refuse l’opération. Une erreur annule contenu, liens, révision et écritures SQL de cette transaction. contentSaved n’est donc pas un événement déjà engagé après commit.
Hooks nommés
| Domaine | Hooks disponibles |
|---|---|
| Contenu | content.beforeValidate, afterValidate, beforeCreate, afterCreate, beforeUpdate, afterUpdate, beforeDelete et afterDelete, tous préfixés par content. |
| Médias | media.beforeUpload, media.afterUpload et media.beforeDelete. |
| Utilisateurs | user.created et user.updated, sans mot de passe ; user.deleted versionné depuis le lot feaf44d. |
| Activation | plugin.beforeActivate, plugin.afterActivate, theme.beforeActivate et theme.afterActivate. |
| Rendu public | render.before et render.after ; aucun appel pour les aperçus privés. |
Chaque callback reçoit une copie de son payload. Un hook peut observer ou refuser l’opération ; modifier cette copie ne transforme pas la donnée. Les filtres servent aux transformations. Les hooks métier participent à leur transaction, avec deux frontières à connaître : media.beforeUpload effectue son précontrôle dans une transaction séparée, et les hooks de rendu possèdent leurs transactions d’observation.
user.updated concerne le profil et ses rôles, pas une simple rotation de mot de passe ou révocation de session. Le lot feaf44d ajoute user.deleted après le DELETE, avant commit, avec un payload versionné sans nom ni adresse du compte. Une erreur annule suppression, cascades, réaffectations et audit. Le contrat de suppression précise ce hook ; le guide des contributions SDK décrit les règles d’identité communes.
Ordre et concurrence
Les hooks des modules actifs sont classés par priorité croissante de -1000 à 1000, puis identifiant, avec priorité 10 par défaut. Dans un même plugin, une ancienne signature précède son équivalent nommé si les deux sont déclarés. Une clé de callback ne peut pas réentrer dans sa chaîne causale, limitée à dix niveaux et propagée aux jobs. Un verrou partagé maintient la version choisie pendant l’opération ; les bascules de package attendent le verrou exclusif.
Enregistrer les effets durables
Utilisez context.services.email.enqueue ou jobs.enqueue pour inscrire une demande dans PostgreSQL avec l’écriture métier. Si la transaction échoue, cette demande disparaît aussi. Le worker l’exécute ensuite avec reprises ; le handler doit être idempotent.
publicRequest
publicRequest(path, context) observe les rendus publics réussis par le CMS et ses pages d’extension. Il sert aux agrégats Analytics activés explicitement. Il ne reçoit ni corps de requête, ni IP, ni identité visiteur et ne constitue pas un middleware HTTP arbitraire.