Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Il était une fois le composant Workflow

Il était une fois le composant Workflow

REX sur la découverte et l'utilisation du composant Workflow pour une API en Symfony 5.4

Florence Cauchy

March 26, 2023
Tweet

Other Decks in Technology

Transcript

  1. Florence Cauchy Développeuse Senior Back-end PHP Symfony M2 Informatique &

    systèmes embarqués 14 ans d'expérience 10 ans avec Symfony 2
  2. 3

  3. 4

  4. Définition Workflow workflow \wɔʁk.flo\ masculin Représentation schématique d'un processus ou

    d'une série de tâches qui doivent être effectuées dans un ordre spécifique pour atteindre un résultat donné. Il peut impliquer des validations et des contrôles à chaque étape du processus. Son but est d'organiser et de rationaliser un processus, ainsi que d’en maximiser l'efficacité. 7
  5. Qu’est ce que le composant Workflow ? Création et gestion

    de processus dans une application : • Permet de décrire un modèle de processus ◦ via des états (places) ◦ et des transitions • Permet de gérer et de structurer les changements d'états 8
  6. 2 types de processus State machine L’objet se trouve à

    un seul endroit. Pour appliquer une transition, l'objet doit se trouver au moins à l'un des emplacements. Workflow L’objet peut se trouver à plusieurs endroits en même temps. Pour appliquer une transition, l'objet doit se trouver à tous les emplacements précédents. 11
  7. Les avantages du composant Moyen flexible et efficace de modéliser

    et de gérer les processus métier d’une application. On peut valider que le panier est passé par l'ensemble des états nécessaires à sa transformation en commande. Utilisation d'événements pour déclencher des actions personnalisées. Historisation possible des changements d'états. 12
  8. Utilisation du composant Workflow dans le projet Controller Workflow Logique

    métier Validation des données Guard Transitions Services Transformer Call API Réponse 13
  9. Cycle de vie d’un panier • création du panier •

    “CRUD” produits • choix de la livraison • ajout d’une adresse de livraison • ajout d’une adresse de facturation • choix du moyen de paiement • finalisation du panier 14 AVEC PRODUIT ADRESSE DE LIVRAISON ADRESSE DE FACTURATION FINALISÉ ASSOCIÉ À UN COMPTE TOUT CRÉATION
  10. Du théorique au code Pour définir son workflow, il suffit

    d’écrire un fichier de configuration (yaml, xml, php) Avec un fichier yaml, Symfony validera le fichier durant le cache warmup En utilisant les classes PHP du composant, il faudra valider manuellement avec WorkflowValidator ou StateMachineValidator 15
  11. Nom Type L’objet à associer au workflow Liste des états

    possibles Statut de l’objet lors de l’initialisation Définition des transitions Configuration minimale 16
  12. Vous pouvez utiliser des métadonnées avec les clés suivantes :

    Pour les états : - bg_color : une couleur (nom ou code hexadécimal : red #FF0000) - description : une chaîne qui décrit l'état Pour les transitions : - label : une chaîne qui remplace le nom de la transition - color, bg_color : une couleur - arrow_color : une couleur 18
  13. Visualisation du workflow Il est possible de générer une représentation

    graphique via : - Graphviz, - Mermaid CLO, - PlantUML 19
  14. Marking store Interface à implémenter pour stocker et récupérer l'état.

    La propriété configurée pour le marking_store doit être déclarée ainsi que ses getter / setter. Le typage se fait en fonction du choix de workflow. 22
  15. Quelques unes des principales méthodes Workflow::can() pour savoir si la

    transition est possible Workflow::apply() pour appliquer une transition Workflow::getEnabledTransitions() voir les transitions applicables Event::isBlocked() savoir si une transition est bloqué Event::setBlocked() bloquer une ou toutes les transitions Event::addTransitionBlocker() bloquer de manière plus spécifique 24
  16. Avec Registry Avant Sf 6.2 Lorsque vous définissez plusieurs workflows,

    on peut utiliser Registry, pour stocker et fournir l'accès aux différents workflows. Aide également à déterminer si un workflow prend en charge l'objet que l’on veut utiliser. 26
  17. Gestion des transitions Il est possible d'appliquer des restrictions aux

    transitions. Par exemple, pour vérifier que l'utilisateur est bien authentifié ou qu'il possède les droits nécessaires. Pour cela, la définition de chaque transition supporte une option guard. 32
  18. Guard Cette option utilise le composant expression language pour faire

    appel à des fonctions telles que is_fully_authenticated() ou is_granted(), et même accéder aux attributs de l'objet concerné. guard: "is_fully_authenticated() and has_role('ROLE_USER') and is_granted(SAME_USER, subject)" guard: "is_valid(subject, [orderable])" Invoqué à chaque utilisation des méthodes du workflow can(), apply() et getEnablesTransitions(). 33
  19. Premier bilan Lisibilité du code Réduction de la complexité de

    la logique métier Définition des workflows dans un fichier de configuration, plutôt que dans le code Possibilité de définir des contraintes sur les transitions Facilité d'intégration avec d'autres composants Symfony 35
  20. Problématique : mauvaise utilisation du contexte Le rôle du contexte

    n’est pas de modifier l’objet mais de contenir des informations supplémentaires Il peut être utilisé pour stocker des données utiles pour prendre des décisions au niveau des transitions. 36
  21. Guard et context Le context est passé aux transitions mais

    pas aux guard Le Guard doit voter en fonction de l’objet et non d’un context 37
  22. Problème de performance ? Sur un ->apply(), le workflow charge

    tous les Guards des transitions possibles, pour savoir si la transition sera possible ou pas. 38
  23. Announce Event Sur apply(), ajouter un paramètre : [Workflow::DISABLE_ANNOUNCE_EVENT =>

    true] Ou dans la configuration définir les événements 39
  24. Passer d’un modèle Workflow à State Machine 3 étapes :

    - Modifier la configuration - Modifier le typage du marking - Renommer dans les classes 42
  25. Fonctions TWIG workflow_can() Retourne si l’objet peut faire la transition

    workflow_transitions() Retourne toutes les transitions possibles pour l’objet workflow_transition() Retourne une transition spécifique workflow_marked_places() Retourne les états courants de l’objet workflow_has_marked_place() Retourne si l’objet a bien l’état donné workflow_transition_blockers() Retourne les transitions blockers 48
  26. Conclusion Outil puissant pour créer et gérer des workflows dans

    une application Il permet une meilleure organisation et une plus grande efficacité dans la gestion des processus métier 49