Saga Lara Flow, un package Laravel d'Andriy Karpishyn (discovery-ukraine), permet d'écrire des processus métier de longue durée comme une seule méthode handle(), sans chaînage de jobs ni machine à états. Débiter une carte, réserver du stock, réserver l'expédition : tout s'écrit en lignes séquentielles. Le package enregistre chaque étape terminée en base de données. Lorsqu'une exécution reprend sur un worker, le moteur ré-exécute handle(), mais les appels via $this->action() renvoient les résultats enregistrés pour les étapes déjà accomplies ; dès que le rejeu atteint du code non exécuté, l'exécution normale reprend. Si une étape lève une exception, les compensations des étapes précédentes se déclenchent en ordre inverse.

Les fonctionnalités clés incluent les compensations via compensateWith() (classe d'action ou closure), les signaux via $this->signal() avec délais optionnels timeoutAfter() et AwaitSignalTimeoutException, les blocs parallèles avec politique failFast() par défaut, les workflows enfants avec ChildClosePolicy (p. ex. Terminate), et sideEffect() pour enregistrer les valeurs non déterministes comme les UUID afin que les rejeux restent cohérents. Les requêtes par tags (withTags(), $this->tag()) et les scopes running(), waiting() et failed() permettent de retrouver des exécutions sans stocker d'ID, par exemple pour envoyer un signal à tous les runs correspondants.

Les workflows étendent la classe Workflow du package ; les actions sont des classes distinctes résolues par le conteneur avec leurs propres réglages de queue : $tries, $timeout et expiresAt(). Des retries épuisés se manifestent par une ActionFailedException, un délai dépassé par une FlowExpiredException. Les étapes optionnelles utilisent continueOnFailure()/optionalAction() avec valeurs de repli. Le builder $this->saga() regroupe des étapes en une unité de rollback avec onCompensationFailure(CompensationFailurePolicy::Continue) et compensateInParallel(). Les runs démarrent via la façade SagaFlow : run() met en file de façon asynchrone, runSync() exécute en processus, idéal pour les assertions de tests. Le versionnement (version('v2')) fige les runs en cours sur leur définition d'origine.

Le package requiert PHP 8.5 et Laravel 13, est sous licence MIT et s'installe via composer require discovery-ukraine/saga-lara-flow, suivi des migrations et de la publication de la configuration. Celle-ci couvre connexion base de données, queue, verrouillage et hooks multi-tenant (closures capture/restore pour le contexte tenant). Commandes Artisan : make:workflow, make:action, saga-flow:list, saga-flow:signal, saga-flow:prune et saga-flow:monitor, à planifier chaque minute pour surveiller les échéances. Documentation sur sagalaraflow.dev ; code source sur GitHub sous discovery-ukraine/saga-lara-flow.