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.| Événement | Moment de déclenchement |
|---|---|
retrieved | Lorsqu’un modèle est récupéré depuis la BDD |
creating | Juste avant la sauvegarde d’un nouveau modèle |
created | Juste après la sauvegarde d’un nouveau modèle |
updating | Juste avant la mise à jour d’un modèle existant |
updated | Juste après la mise à jour d’un modèle existant |
saving | Juste avant la sauvegarde (création ou mise à jour) |
saved | Juste après la sauvegarde (création ou mise à jour) |
deleting | Juste avant la suppression d’un modèle |
deleted | Juste après la suppression d’un modèle |
trashed | Juste après un soft delete |
forceDeleting | Juste avant une suppression physique |
forceDeleted | Juste après une suppression physique |
restoring | Juste avant la restauration d’un soft delete |
restored | Juste après la restauration d’un soft delete |
replicating | Lors de l’appel à replicate() |
-ing sont émis avant la persistance en BDD, ceux terminant par -ed sont émis après.
Écouteurs d’événements via closures
Pour traiter les événements simplement, vous pouvez enregistrer des closures dans la méthodebooted du modèle.
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.
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.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é.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.
Enregistrer l'Observer sur le Model
Il existe deux méthodes d’enregistrement. Sous Laravel 13, l’utilisation de l’attribut Pour enregistrer plusieurs Observers, répétez l’attribut ou passez un tableau.Méthode 2 : enregistrement dans
#[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.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’interfaceShouldHandleEventsAfterCommit pour obtenir ce comportement.
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.
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.
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].