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

SymfonyLive London 2016 - The Workflow Awakens

SymfonyLive London 2016 - The Workflow Awakens

It is common having to handle statuses or product states, either on e-commerce or editorial websites. To do that, you can use the classical -manual- way, or get help from libraries covering the basis.

In this talk, we will talk about the state machine concept and definition before considering its usage looking at existing open source libraries. Finally following the Symfony way, we will study the brand-new "Workflow" component.

Tugdual Saunier

September 16, 2016
Tweet

More Decks by Tugdual Saunier

Other Decks in Technology

Transcript

  1. The Workflow Awakens
    Tugdual Saunier

    View Slide

  2. 2
    Tugdual Saunier
    @tucksaun
    Shipping guy.

    Loves Dev, Ops and
    automation.
    London, UK
    Blackfire.io/SensioLabs

    View Slide

  3. 3
    History of the

    Workflow component

    View Slide

  4. 4
    Genesis

    View Slide

  5. Winter 2013
    5

    View Slide

  6. 6

    View Slide

  7. Do we open
    source it?
    7

    View Slide

  8. Yes !
    8

    View Slide

  9. In Symfony?
    9

    View Slide

  10. Ok, but Greg
    does the PR
    10

    View Slide

  11. 11

    View Slide

  12. As usual for @lyrixx
    12

    View Slide

  13. September 2014
    13

    View Slide

  14. Lack of time
    14

    View Slide

  15. February 2016
    15

    View Slide

  16. Let’s get back to
    work
    16

    View Slide

  17. 17
    But was is it?

    View Slide

  18. 18
    What problems should it
    address?

    View Slide

  19. 19
    On an editorial website, there are several kinds of
    people involved.
    Freelancers, journalists, spellcheckers, chief editor,
    publication director, …
    An article is not published that easily.
    Context

    View Slide

  20. 20
    For example, an article must be validated by a
    journalist and a spellchecker.
    Otherwise, the article can not be published.
    Rules exist

    View Slide

  21. 21
    The component responsibili﬚ is to ensure the article
    properly goes by all validation steps.
    Welcome Workflow!

    View Slide

  22. 22
    Workflow:

    a State Machine

    View Slide

  23. 23
    States / Transitions
    state A state B
    Transition T1

    View Slide

  24. 24
    Oriented Graph
    A B
    T1
    C
    D
    E
    T2
    T3
    T4
    T5

    View Slide

  25. 25
    Get back to the PR

    View Slide

  26. Read the code
    one more time
    26

    View Slide

  27. Being able to handle article publication process
    There is a serie of steps that must be fulfilled
    Only some users can move from one step to the
    other
    Some steps can be done at the same time
    Define the specs
    27

    View Slide

  28. 28
    Example

    View Slide

  29. Let’s face it,

    a state machine is
    not appropriate
    29

    View Slide

  30. Read some doc
    30

    View Slide

  31. Explore existing
    libraries
    31

    View Slide

  32. State machine:
    https:/
    /github.com/yohang/Finite
    https:/
    /github.com/winzou/state-machine
    Petrinet
    https:/
    /github.com/florianv/petrinet
    https:/
    /github.com/alterway/component-workflow
    Other
    https:/
    /github.com/vespolina/workflow
    Overview
    32

    View Slide

  33. 33
    Let’s move Workflow code
    to a “Workflow net”

    View Slide

  34. 34
    What’s this?

    View Slide

  35. 35
    This is an extension of Petri networks.
    It looks like state machines.
    But with more features.
    Note: Symfony Workflow component does not implement all the specs.
    Workflow Net

    View Slide

  36. 36
    Places / Transitions
    place A place B
    Transition T1

    View Slide

  37. 37
    Several Inputs Outputs
    place place
    Transition
    place place

    View Slide

  38. 38
    Tokens

    View Slide

  39. Schrödinger's cat
    39

    View Slide

  40. 40
    Marking

    View Slide

  41. 41
    Some Workflow examples

    View Slide

  42. 42
    Straight

    View Slide

  43. 43
    Round Trip

    View Slide

  44. 44
    Or

    View Slide

  45. 45
    And / Parallel

    View Slide

  46. 46
    Wait, what?

    View Slide

  47. 47
    Let’s implement

    View Slide

  48. Diff
    48

    View Slide

  49. 49
    Workflow::can()

    View Slide

  50. 50
    Workflow::can() example

    View Slide

  51. 51
    Workflow::apply()

    View Slide

  52. 52
    Workflow::apply() example

    Before

    View Slide

  53. 53
    Workflow::apply() example

    After

    View Slide

  54. 54
    Workflow::getEnabledTransitions()

    View Slide

  55. 55
    Definition class : Places

    View Slide

  56. 56
    Definition class : Transitions

    View Slide

  57. 57
    Definition class : Transitions

    View Slide

  58. 58
    Definition class : Transitions

    View Slide

  59. 59
    Definition class : Transitions

    View Slide

  60. 60
    Graphviz dumper

    View Slide

  61. 61
    The EventDispatcher has been plugged into the
    Workflow !
    Events are dispatched each time:
    • a place is leſt
    • a transition is fired
    • a place is reached
    Events

    View Slide

  62. 62
    plus one : GuardEvent

    View Slide

  63. 63
    What about Symfony?

    View Slide

  64. 64
    It is always recommended to first draw your workflow
    on paper first to try it beforehand.
    Definition - By Hand

    View Slide

  65. 65
    Definition - YML

    View Slide

  66. 66
    Definition - YML - Supports

    View Slide

  67. 67
    Definition - YML - Places

    View Slide

  68. 68
    Definition - YML - Transitions

    View Slide

  69. 69
    What does it look like?

    View Slide

  70. 70
    The view

    View Slide

  71. 71
    The view

    View Slide

  72. 72
    The controller

    View Slide

  73. 73
    What about guard?

    View Slide

  74. 74
    What about guard?

    View Slide

  75. 75
    What about guard?

    View Slide

  76. 76
    Demo ?

    View Slide

  77. @blackfireio #blackfireio

    View Slide