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. Il était une fois le
    composant Workflow
    Un composant dans tous ses états

    View Slide

  2. 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

    View Slide

  3. 3

    View Slide

  4. 4

    View Slide

  5. Qu’est ce qu’un Order Management System ?
    5

    View Slide

  6. Découverte du composant Workflow !
    6

    View Slide

  7. 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

    View Slide

  8. 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

    View Slide

  9. Représentation graphique
    Init Place_A
    9

    View Slide

  10. Le workflow du projet initial
    10

    View Slide

  11. 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

    View Slide

  12. 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

    View Slide

  13. 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

    View Slide

  14. 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

    View Slide

  15. 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

    View Slide

  16. 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

    View Slide

  17. Configuration avancée
    17

    View Slide

  18. 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

    View Slide

  19. Visualisation du workflow
    Il est possible de générer une représentation graphique via :
    - Graphviz,
    - Mermaid CLO,
    - PlantUML
    19

    View Slide

  20. Commandes de Debug
    Lister les différents workflows définit
    Lister les transitions pour un workflow donné
    20

    View Slide

  21. Représentation graphique
    21

    View Slide

  22. 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

    View Slide

  23. Initialisation
    La méthode
    getMarking() est appelé
    afin de déclencher
    l'initialisation à l'état de
    départ (initial_place)
    23

    View Slide

  24. 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

    View Slide

  25. Utilisation dans un controller
    Via le ServiceContainer
    25

    View Slide

  26. 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

    View Slide

  27. Avec un Attribute
    Sf 6.3 ✨
    27

    View Slide

  28. Utilisation dans un service
    28

    View Slide

  29. Utilisation d'évènements (EventDispatcher)
    workflow.leave
    workflow.transition
    workflow.enter
    workflow.entered
    workflow.completed
    workflow.announce
    workflow.[event]
    workflow.[workflow name].[event]
    workflow.[workflow name].[event].[place name]
    29

    View Slide

  30. Exemple d’une utilisation des WorkflowEvents
    30

    View Slide

  31. Events context
    Chaque événement dispose d’un paramètre $context
    31

    View Slide

  32. 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

    View Slide

  33. 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

    View Slide

  34. Utilisation d’un Guard
    34

    View Slide

  35. 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

    View Slide

  36. 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

    View Slide

  37. 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

    View Slide

  38. 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

    View Slide

  39. Announce Event
    Sur apply(), ajouter un paramètre : [Workflow::DISABLE_ANNOUNCE_EVENT
    => true]
    Ou dans la configuration définir les événements
    39

    View Slide

  40. Autres problématiques
    Présentation versus utilisation
    Complexité du workflow ?
    Compréhension différente
    40

    View Slide

  41. Vers un workflow en state machine
    41

    View Slide

  42. Passer d’un modèle Workflow à State Machine
    3 étapes :
    - Modifier la configuration
    - Modifier le typage du marking
    - Renommer dans les classes
    42

    View Slide

  43. Modification de la configuration
    43

    View Slide

  44. Single state marking store
    44

    View Slide

  45. Renommage dans les classes
    On passe de nameUsedWorkflow à nameUsedStateMachine
    45

    View Slide

  46. Tadaaaa 🥳
    46

    View Slide

  47. Une partie front ?
    Intégration avec TWIG
    Plusieurs fonctions disponibles
    47

    View Slide

  48. 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

    View Slide

  49. 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

    View Slide

  50. Merci 🤗
    50
    on recrute !

    View Slide