Symfony Messenger : messages, handlers et files d'attente
Symfony Messenger fait passer un message par un bus jusqu'à son handler : le code qui annonce une action ne sait plus qui la traite, ni quand.
final readonly class ConfirmationDemandee { public function __construct(public int $reservationId) {} } #[AsMessageHandler] final class ConfirmationDemandeeHandler { public function __invoke(ConfirmationDemandee $message): void { $reservation = $this->reservations->find($message->reservationId); // … } } // Dans le contrôleur, après l'enregistrement : $bus->dispatch(new ConfirmationDemandee($reservation->getId()));
Un contrôleur qui envoie lui-même la confirmation, prévient la comptabilité et met à jour un index fait trop de choses, et fait attendre le client. Avec Messenger, il dispatche un message, une classe qui ne porte que des données, et un handler marqué #[AsMessageHandler] s'en occupe ; un transport peut ensuite mettre ce message en file pour qu'un worker le traite plus tard, sans toucher au code. Le piège : un message lu plus tard ne transporte que ce qu'on y a mis. On y place l'identifiant d'une entité, pas l'entité elle-même, et le handler la relit au moment où il travaille. S'il reçoit autre chose que ce qu'il croit, il travaille dans le vide, sans erreur.
Les exercices font envoyer les corbeaux de confirmation de la taverne par un bus, puis réparer une volière où des messages se perdent sans laisser de trace.
2 exercices font travailler cette notion, en écrivant du code dans le navigateur.
Dans les parcours
- Le premier corbeau Symfony pour les devs PHP · chapitre 7 : Le corbeau messager
- 🐉 Boss : la volière en panne Symfony pour les devs PHP · chapitre 7 : Le corbeau messager