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.
Hooks avant et après : creating/created, updating/updated, deleting/deleted.
Nouveauté moderne : déclarez l'observer directement au-dessus du modèle via un attribut PHP 8 natif.
Éliminez la logique redondante des contrôleurs : la génération de slugs et la purge d'images deviennent automatiques.
Historisez qui a modifié quoi et quand en interceptant silencieusement chaque sauvegarde en base.
// 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);
}
}
}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).
| Événement | Moment du Déclenchement | Cas d'Usage Recommandé |
|---|---|---|
creating / created | Avant / Après l'insertion du nouvel enregistrement. | Générer un slug ou UUID / Envoyer un email de bienvenue. |
updating / updated | Avant / Après la mise à jour d'un modèle existant. | Recalculer des totaux / Consigner un log de révision. |
deleting / deleted | Avant / Après la suppression du modèle. | Vérifier des contraintes / Supprimer les fichiers physiques du disque. |
restoring / restored | Avant / Après la restauration d'un SoftDelete. | Réactiver les abonnements ou services liés. |