Skip to main content

Qu’est-ce qu’un événement de modèle

Les modèles Eloquent émettent automatiquement des événements aux différentes étapes de leur cycle de vie. En s’accrochant à ces événements, vous pouvez insérer des traitements avant et après les sauvegardes, suppressions, etc. Les événements émis par Eloquent sont les suivants. Les événements terminant par -ing sont émis avant la persistance en BDD, ceux terminant par -ed sont émis après.
Lors des mass updates ou mass deletes (par exemple User::where(...)->update(...)), les événements saving, saved, updating, updated, deleting, deleted ne sont pas émis. Les modèles ne sont en effet pas réellement récupérés.

Écouteurs d’événements via closures

Pour traiter les événements simplement, vous pouvez enregistrer des closures dans la méthode booted du modèle.
Pour exécuter le traitement en asynchrone via une queue, utilisez le helper queueable.

Propriété $dispatchesEvents

Pour interagir avec le système d’événements de Laravel, mappez les événements du modèle sur des classes d’événements personnalisées via la propriété $dispatchesEvents.
Les classes d’événements mappées reçoivent l’instance du modèle dans leur constructeur.

Création d’une classe Observer

Lorsqu’un même modèle doit traiter plusieurs événements, regrouper le tout dans une classe Observer est plus propre que d’aligner des closures.
1

Générer la classe avec Artisan

Générez le squelette avec la commande make:observer. L’option --model ajoute automatiquement les méthodes correspondant au modèle.
app/Observers/UserObserver.php est généré.
2

Implémenter les méthodes de chaque événement

Le nom de la méthode correspond au nom de l’événement. L’argument reçoit l’instance du modèle.
3

Enregistrer l'Observer sur le Model

Il existe deux méthodes d’enregistrement. Sous Laravel 13, l’utilisation de l’attribut #[ObservedBy] est recommandée.Méthode 1 : attribut #[ObservedBy] (recommandée)Il suffit d’appliquer l’attribut à la classe du modèle pour terminer l’enregistrement. Aucun changement dans AppServiceProvider n’est nécessaire.
Pour enregistrer plusieurs Observers, répétez l’attribut ou passez un tableau.
Méthode 2 : enregistrement dans AppServiceProviderAppelez observe dans la méthode boot de AppServiceProvider.
L’attribut #[ObservedBy] se trouve dans le namespace Illuminate\Database\Eloquent\Attributes. C’est une syntaxe native PHP 8.0+ activement adoptée dans Laravel 13.

Observers dans les transactions BDD

Lorsqu’un modèle est créé ou mis à jour dans une transaction, il est parfois souhaitable d’exécuter l’Observer après le commit de la transaction. Implémentez l’interface ShouldHandleEventsAfterCommit pour obtenir ce comportement.
En dehors d’une transaction, l’exécution est immédiate comme d’habitude.

Désactiver temporairement les événements

withoutEvents pour désactiver les événements sur un traitement précis

Dans la closure passée à User::withoutEvents(), aucun événement de modèle n’est émis.

saveQuietly pour désactiver les événements à la sauvegarde

Pour sauvegarder sans émettre d’événement, utilisez saveQuietly.
Des méthodes similaires existent pour la suppression, la restauration et la réplication.

Cas d’usage pratiques

Nettoyage automatique du cache

Lorsqu’un modèle est mis à jour ou supprimé, nettoyez automatiquement le cache associé.

Journal d’audit

Consignez automatiquement l’historique des modifications d’un modèle. getDirty() permet de récupérer les valeurs modifiées.
L’événement updating est émis avant la sauvegarde en BDD, donc getDirty() retourne les valeurs sur le point d’être modifiées. Appelé après l’événement updated, getDirty() sera vide.

Mise à jour automatique de modèles associés

Exemple de mise à jour automatique des stocks à la finalisation d’une commande.

Étapes suivantes

Avancé : attributs PHP

Faites un tour d’ensemble des attributs PHP dans Laravel 13, y compris #[ObservedBy].
Dernière modification le 13 juillet 2026