Slide 1

Slide 1 text

Le composant workflow de Symfony, c’est graphement bien.

Slide 2

Slide 2 text

Les-Tilleuls.coop Lead Dev Symfony chez Les-Tilleuls.coop Core Team Api-Platform Contributeur Symfony @cDaed Simperfit Bureau étendu AFUP Hamza Amrouche

Slide 3

Slide 3 text

Les-Tilleuls.coop Les-Tilleuls.coop SCOP fondée en 2011 Détenue à 100% par ses salariés 25 coopérateurs, 97% de croissance On recrute à Amiens, Lille, Paris et Londres [email protected]

Slide 4

Slide 4 text

Les-Tilleuls.coop L’accompagnement des particuliers et des professionnels du bâtiment Groupe Adeo (Leroy Merlin) Équipe technique de 20 personnes (St Cloud) Quotatis est présent aujourd’hui au Symfony Live Quotatis

Slide 5

Slide 5 text

Les-Tilleuls.coop

Slide 6

Slide 6 text

Les-Tilleuls.coop demo quotatis projet

Slide 7

Slide 7 text

Les-Tilleuls.coop La théorie des graphes A B D C

Slide 8

Slide 8 text

Les-Tilleuls.coop La théorie des graphes A B C D

Slide 9

Slide 9 text

Les-Tilleuls.coop La théorie des graphes A B C D

Slide 10

Slide 10 text

Les-Tilleuls.coop La théorie des graphes A C D B

Slide 11

Slide 11 text

Les-Tilleuls.coop La théorie des graphes A C 5 B

Slide 12

Slide 12 text

Les-Tilleuls.coop A B 3 6 2 3 4 2 1 5 2 La théorie des graphes

Slide 13

Slide 13 text

Les-Tilleuls.coop A 3 6 2 3 4 2 1 5 2 B La théorie des graphes

Slide 14

Slide 14 text

Les-Tilleuls.coop 3 6 2 3 4 2 1 5 2 A B La théorie des graphes

Slide 15

Slide 15 text

Les-Tilleuls.coop La théorie Graphes

Slide 16

Slide 16 text

Les-Tilleuls.coop La théorie des graphes

Slide 17

Slide 17 text

Les-Tilleuls.coop La théorie Graphes Arbre

Slide 18

Slide 18 text

Les-Tilleuls.coop Workflow Graphes Arbre La théorie

Slide 19

Slide 19 text

Les-Tilleuls.coop Transitions Arcs Place Le réseau de pétri

Slide 20

Slide 20 text

Les-Tilleuls.coop Transitions Arcs Place Le réseau de pétri

Slide 21

Slide 21 text

Les-Tilleuls.coop Transitions Arcs Place Tokens Le réseau de pétri

Slide 22

Slide 22 text

Les-Tilleuls.coop Transitions Arcs Place Tokens Le réseau de pétri

Slide 23

Slide 23 text

Les-Tilleuls.coop Transitions Arcs Place Tokens Le réseau de pétri

Slide 24

Slide 24 text

Les-Tilleuls.coop Le réseau de pétri

Slide 25

Slide 25 text

Les-Tilleuls.coop Le réseau de pétri

Slide 26

Slide 26 text

Les-Tilleuls.coop Le réseau de pétri

Slide 27

Slide 27 text

Les-Tilleuls.coop Théorie Graphes Arbre Workflow Machine à états

Slide 28

Slide 28 text

Les-Tilleuls.coop Une machine à états A D C t1 B t0b t0a

Slide 29

Slide 29 text

Les-Tilleuls.coop Qu’est-ce que le composant Workflow ?

Slide 30

Slide 30 text

Les-Tilleuls.coop

Slide 31

Slide 31 text

Les-Tilleuls.coop

Slide 32

Slide 32 text

Les-Tilleuls.coop Quelle est son utilité ?

Slide 33

Slide 33 text

Les-Tilleuls.coop Place Transition A t0 Place B Arcs Arcs Un workflow classique worklow-net

Slide 34

Slide 34 text

Les-Tilleuls.coop A t0 B C t1 D Un workflow single state

Slide 35

Slide 35 text

Les-Tilleuls.coop A C B t0 Un workflow multiple state

Slide 36

Slide 36 text

Les-Tilleuls.coop A D C t1 B t0b t0a Une machine à états

Slide 37

Slide 37 text

Les-Tilleuls.coop $definition = new Definition([‘in_progress',‘to_validate'], [ new Transition( ‘to_validate', // transition name [‘in_progress’], // from place [‘to_validate'] // to place ) ], ‘in_progress' ); } Définition du workflow

Slide 38

Slide 38 text

Les-Tilleuls.coop Définition du workflow

Slide 39

Slide 39 text

Les-Tilleuls.coop workflows: project: type: 'state_machine' # 'workflow' # […] Définition du workflow

Slide 40

Slide 40 text

Les-Tilleuls.coop workflows: project: type: 'state_machine' marking_store: type: single_state # […] Définition du workflow

Slide 41

Slide 41 text

Les-Tilleuls.coop workflows: project: type: 'workflow' marking_store: type: multiple_state # […] Définition du workflow

Slide 42

Slide 42 text

Les-Tilleuls.coop workflows: project: type: 'state_machine' marking_store: type: single_state arguments: - status Définition du workflow

Slide 43

Slide 43 text

Les-Tilleuls.coop workflows: project: # […] supports: - AppBundle\Entity\Project places: - created - to_validate Définition du workflow

Slide 44

Slide 44 text

Les-Tilleuls.coop workflows: project: # […] transitions: to_validate: from: created to: to_validate Définition du workflow

Slide 45

Slide 45 text

Les-Tilleuls.coop bin/console workflow:dump project | dot -Tpng -o etc/project-graph.png http://graphviz.org/download/ Graphviz

Slide 46

Slide 46 text

Les-Tilleuls.coop Graphviz

Slide 47

Slide 47 text

Les-Tilleuls.coop Le composant nous permet de garantir que les projets qui sont dans certains états (places) ont bien passé toutes les règles de validation. Merci au Workflow !

Slide 48

Slide 48 text

Les-Tilleuls.coop Un workflow en prod

Slide 49

Slide 49 text

Les-Tilleuls.coop Le can()

Slide 50

Slide 50 text

Les-Tilleuls.coop Le apply()

Slide 51

Slide 51 text

Les-Tilleuls.coop Les events !

Slide 52

Slide 52 text

Les-Tilleuls.coop Les events public static function getSubscribedEvents() { return [ 'workflow.project.enter.to_validate'=> ['assignUser'], 'workflow.project.entered.validated' => ['sendToLegacy'], ]; }

Slide 53

Slide 53 text

Les-Tilleuls.coop class BlogPostReviewListener implements EventSubscriberInterface { public function guardReview(GuardEvent $event) { $post = $event->getSubject(); $title = $post->title; if (!$title) { // Posts with no title should not be allowed $event->setBlocked(true); } } public static function getSubscribedEvents() { return ['workflow.blogpost.guard.to_review' => ['guardReview']]; } } Le guard event

Slide 54

Slide 54 text

Les-Tilleuls.coop La vue

Actions

{% if workflow_can(post, 'publish') %} Publish article {% endif %}

Slide 55

Slide 55 text

Les-Tilleuls.coop {# Or loop through the enabled transitions #} {% for transition in workflow_transitions(post) %} {{ transition.name }} {% endfor %} La vue

Slide 56

Slide 56 text

Les-Tilleuls.coop {# Check if the object is in some specific place #} {% if workflow_has_marked_place(post, 'to_review') %}

This post is ready for review.

{% endif %} La vue

Slide 57

Slide 57 text

Les-Tilleuls.coop {# Check if some place has been marked on the object #} {% if 'waiting_some_approval' in workflow_marked_places(post) %} PENDING {% endif %} La vue

Slide 58

Slide 58 text

Les-Tilleuls.coop Contexte Quotatis Quotatis permet aux personnes qui souhaitent faire des travaux de créer des projets, ceux-ci ont plusieurs états. Pour atteindre ces états il y a des conditions, qui ne sont remplies que si le projet est prêt.

Slide 59

Slide 59 text

Les-Tilleuls.coop L’utilisation au quotidien

Slide 60

Slide 60 text

Les-Tilleuls.coop En mode API Scenario: As authenticated user, I can set the project's status to "to_validate" Given I am authenticated as user And there is a newly created project When I set the project's status to "to_validate" Then I should get a project And the status should be "to_validate" And I should be assigned to the project L’utilisateur à travers l’application :

Slide 61

Slide 61 text

Les-Tilleuls.coop L’API elle-même qui transforme le projet en « pending_search » lorsque qu’un appel à l’api « Legacy » est fait. // […] $project->setLeadReference((string) $xml->newid); if ($this->projectWorkflow->can($project, ‘pending_search’)) { $this->projectWorkflow->apply($project, ‘pending_search’); } // […] En mode API

Slide 62

Slide 62 text

Les-Tilleuls.coop

Slide 63

Slide 63 text

Les-Tilleuls.coop La « Legacy » qui transforme le projet en « found » lorsque le projet a trouvé son artisan.
 
 Via un simple PUT. En mode API

Slide 64

Slide 64 text

Les-Tilleuls.coop private function checkStatusWorkflow(Project $data) { $content = json_decode($request->getContent(), true); if (isset($content[‘status’])) { return; } if ($this->projectWorkflow->can($data, $status)) { $this->projectWorkflow->apply($data, $status); return; } throw new BadRequestHttpException('status.not_in_workflow'); } En mode API

Slide 65

Slide 65 text

Les-Tilleuls.coop Petite Démo

Slide 66

Slide 66 text

Les-Tilleuls.coop demo

Slide 67

Slide 67 text

Les-Tilleuls.coop Symfony 3.4 Symfony 4.1 http://symfony-workflow-demo.herokuapp.com

Slide 68

Slide 68 text

Les-Tilleuls.coop Ajout des transitions blockers 3.4 : https://github.com/symfony/symfony/pull/23499

Slide 69

Slide 69 text

Les-Tilleuls.coop framework: workflows: issue: marking_store: type: single_state arguments: - state supports: AppBundle\Entity\Project places: - created - to_valdate transitions: affect: guard: "is_valid(subject, [‘toValidate’]) » from: created to: to_validate

Slide 70

Slide 70 text

Les-Tilleuls.coop Ajout des transitions blockers 4.1: https://github.com/symfony/symfony/pull/26076

Slide 71

Slide 71 text

Les-Tilleuls.coop Ajout des transitions blockers $event->addTransitionBlocker( new TransitionBlocker('You can not validate the project. Try again tomorrow morning.') ); Exemple par Javier Eguiluz.

Slide 72

Slide 72 text

Les-Tilleuls.coop Ajout des transitions blockers {# […] get the transition.name #}
    {% for blocker in workflow_build_transition_blocker_list(project, transition.name) %}
  • {{ blocker.message }} {% if blocker.parameters.expression is defined %} {{ blocker.parameters.expression }} {% endif %}
  • {% endfor %}
Exemple par Javier Eguiluz.

Slide 73

Slide 73 text

Les-Tilleuls.coop Plus de contraintes sur le nom des places 4.1: https://github.com/symfony/symfony/pull/26079

Slide 74

Slide 74 text

Les-Tilleuls.coop Before weird: places: - a' - é! - b\"(\" supports: AppBundle\Entity\Project transitions: - from: a' name: "{}" to: é! type: workflow Exemple par Grégoire Pineau. The place "é!" contains invalid characters.

Slide 75

Slide 75 text

Les-Tilleuls.coop After weird: places: - a' - é! - b\"(\" supports: AppBundle\Entity\Project transitions: - from: a' name: "{}" to: é! type: workflow Exemple par Grégoire Pineau.

Slide 76

Slide 76 text

Les-Tilleuls.coop Un store de metadata 4.1: https://github.com/symfony/symfony/pull/26079

Slide 77

Slide 77 text

Les-Tilleuls.coop Un store de metadata framework: workflows: project: supports: - App\Entity\Project metadata: description: 'This is a project' # ... places: created: metadata: some_key: 'some_value' # ... transitions: to_validate: metadata: some_key: 'some_value' Exemple par Javiere Eguiluz.

Slide 78

Slide 78 text

Les-Tilleuls.coop Un store de metadata public function onReview(Event $event) { $metadataStore = $event->getWorkflow()->getMetadataStore(); foreach ($event->getTransition()->getTos() as $place) { $this->flashbag->add('info', $metadataStore->getPlaceMetadata($place)->get(‘description')); } } Exemple par Javier Eguiluz.

Slide 79

Slide 79 text

Les-Tilleuls.coop Un store de metadata Current place(s)
    {% for place in workflow_marked_places(article) %}
  • {{ place }}: {{ workflow_metadata(article, 'title', place) ?: 'n-a'}}
  • {% endfor %}
Exemple par Javier Eguiluz.

Slide 80

Slide 80 text

Les-Tilleuls.coop Un store de metadata Enabled transition(s)
    {% for transition in workflow_transitions(article) %}
  • {{ transition.name }}: {{ workflow_metadata(article, 'title', transition) ?: 'n-a'}}
  • {% endfor %}
Exemple par Javier Eguiluz.

Slide 81

Slide 81 text

Les-Tilleuls.coop Un nouveau dumper

Slide 82

Slide 82 text

Les-Tilleuls.coop PlantUML php bin/console workflow:dump project --dump-format=puml | java -jar plantuml.jar -p > workflow.png http://plantuml.com/

Slide 83

Slide 83 text

Les-Tilleuls.coop

Slide 84

Slide 84 text

Les-Tilleuls.coop Une nouvelle interface… 
 Pour les gouverner tous !

Slide 85

Slide 85 text

Les-Tilleuls.coop

Slide 86

Slide 86 text

Les-Tilleuls.coop

Slide 87

Slide 87 text

Les-Tilleuls.coop interface WorkflowInterface { public function getMarking($subject); public function can($subject, $transitionName); public function buildTransitionBlockerList($subject, string $transitionName): TransitionBlockerList; public function apply($subject, $transitionName); public function getEnabledTransitions($subject); public function getName(); public function getDefinition(); public function getMarkingStore(); public function getMetadataStore(): MetadataStoreInterface; } 4.1: https://github.com/symfony/symfony/pull/24751

Slide 88

Slide 88 text

Les-Tilleuls.coop À quoi ça sert ?

Slide 89

Slide 89 text

Les-Tilleuls.coop Merci ! Des questions ? @cDaed Simperfit http://simperfit.fr