Workflow Symfony : machine à états et transitions

Le composant Workflow de Symfony décrit le cycle de vie d'un objet, ses places et ses transitions, une fois pour toutes, et refuse tout passage non prévu.

// Le nom de l'argument choisit le workflow « reservation » (une state_machine).
public function transition(Reservation $reservation, string $transition, WorkflowInterface $reservationStateMachine): Response
{
    if (!$reservationStateMachine->can($reservation, $transition)) {
        // transition inconnue, interdite depuis cette place, ou bloquée par une garde
    }
    $reservationStateMachine->apply($reservation, $transition);
}

#[AsEnteredListener(workflow: 'reservation', place: 'confirmee')]
public function confirmee(EnteredEvent $event): void { /* envoyer la confirmation */ }

Un statut géré à coups de if ($statut === …) finit par laisser passer une réservation honorée sans avoir été confirmée. Une machine à états (state_machine) déclare les places possibles et les transitions permises ; le service sait où en est l'objet (getMarking()), ce qu'on peut faire (can()) et le fait avancer (apply()). À chaque transition, il émet des événements, guard, leave, entered et d'autres, auxquels on accroche gardes et effets. Le piège est d'écouter le mauvais : leave part pour toutes les transitions qui quittent une place, y compris l'annulation, là où entered ne vise que l'arrivée à la place voulue.

Les exercices font décrire la vie d'une réservation de la taverne, de la demande au repas, puis réparer un registre où les transitions, les gardes et les parchemins envoyés ne disent plus la même chose.

2 exercices font travailler cette notion, en écrivant du code dans le navigateur.

Dans les parcours

Notions voisines

DébogageGardesÉvénements du workflowMailer