Événements et Listeners
Utiliser les événements pour les changements de domaine significatifs et les réactions cross-module.
Quand utiliser les événements
À faire :
- Émettre un événement après un changement de rôle utilisateur
- Émettre un événement après la fin d'un import
- Émettre un événement quand une alerte doit être créée depuis un autre module
- Utiliser des listeners en file d'attente pour les effets de bord lents
À ne pas faire :
- Utiliser les événements pour masquer la logique métier synchrone centrale
- Utiliser les événements pour des appels simples contrôleur → service
- Mettre l'autorisation dans les listeners sauf si c'est le point d'entrée
Convention de nommage
| Type | Exemple |
|---|---|
| Événement domaine au passé | UserPermissionUpdated |
| Processus terminé | ImportParsingCompleted |
| Alerte demandée | AlertCreationRequested |
Règle de payload
Les payloads doivent contenir des IDs de modèle ou de petits DTOs immutables. Ne pas passer de grands tableaux mutables.
Exemple
// Événement
class ImportParsingCompleted
{
public function __construct(
public readonly int $importId,
public readonly string $module,
public readonly int $rowCount,
) {}
}
// Dispatching
event(new ImportParsingCompleted($import->id, 'analyses', $rowCount));
// Listener
class SendImportNotification implements ShouldQueue
{
public function handle(ImportParsingCompleted $event): void
{
// notification asynchrone
}
}