Laravel
Laravel 11 & 10 • Chapitre 4 : Fonctionnalités Avancées

Model Observers : Automatisez le Cycle de Vie Eloquent

Les Observers permettent d'écouter les événements survenus sur vos modèles Eloquent (création, mise à jour, suppression) pour exécuter des actions transversales (génération de slugs, envoi d'emails, purge de fichiers ou audit) sans surcharger vos contrôleurs.

🔄
Cycle de Vie Complet

Hooks avant et après : creating/created, updating/updated, deleting/deleted.

✨
Attribut #[ObservedBy]

Nouveauté moderne : déclarez l'observer directement au-dessus du modèle via un attribut PHP 8 natif.

🧹
Code Épuré (DRY)

Éliminez la logique redondante des contrôleurs : la génération de slugs et la purge d'images deviennent automatiques.

📊
Traçabilité & Audit

Historisez qui a modifié quoi et quand en interceptant silencieusement chaque sauvegarde en base.

app/Observers/ProductObserver.php (Attribut PHP 8)
// Commande Artisan : php artisan make:observer ProductObserver --model=Product

// 1. app/Models/Product.php : Enregistrement moderne via Attribut PHP 8 (Laravel 10 / 11)
namespace AppModels;

use AppObserversProductObserver;
use IlluminateDatabaseEloquentAttributesObservedBy;
use IlluminateDatabaseEloquentModel;

#[ObservedBy([ProductObserver::class])]
class Product extends Model
{
    protected $fillable = ['name', 'slug', 'price', 'image_path'];
}

// 2. app/Observers/ProductObserver.php : Implémentation des hooks
namespace AppObservers;

use AppModelsProduct;
use IlluminateSupportStr;
use IlluminateSupportFacadesStorage;
use IlluminateSupportFacadesLog;

class ProductObserver
{
    // Déclenché AVANT insertion SQL : calcul du slug automatique
    public function creating(Product $product): void
    {
        $product->slug = Str::slug($product->name);
    }

    // Déclenché APRÈS insertion SQL : log ou notification
    public function created(Product $product): void
    {
        Log::info("Nouveau produit créé : {$product->name} (ID: {$product->id})");
    }

    // Déclenché APRÈS suppression : suppression physique de l'image sur le disque
    public function deleted(Product $product): void
    {
        if ($product->image_path) {
            Storage::disk('public')->delete($product->image_path);
        }
    }
}

Simulateur Chronologie des Événements & Hooks d'Observer

Simulation Événementielle

Exécutez une action sur le produit simulé et observez l'ordre précis d'exécution des hooks (avant et après l'opération SQL).

Cliquez sur une action ci-dessus pour observer les hooks en temps réel.
ID :#1
Nom :Clavier Mécanique M3
Slug (généré) :clavier-mecanique-m3
Prix :99 €
Image :products/clavier-m3.webp

Statut BDD :Présent en BDD
Les Événements de Modèle Disponibles
ÉvénementMoment du DéclenchementCas d'Usage Recommandé
creating / createdAvant / Après l'insertion du nouvel enregistrement.Générer un slug ou UUID / Envoyer un email de bienvenue.
updating / updatedAvant / Après la mise à jour d'un modèle existant.Recalculer des totaux / Consigner un log de révision.
deleting / deletedAvant / Après la suppression du modèle.Vérifier des contraintes / Supprimer les fichiers physiques du disque.
restoring / restoredAvant / Après la restauration d'un SoftDelete.Réactiver les abonnements ou services liés.