SlideShare une entreprise Scribd logo
1  sur  35
Le composant workflow
de Symfony, un truc
graphement bien.
Hamza Amrouche
Hamza Amrouche
Lead Dev Symfony chez Les-Tilleuls.coop
Core Team Api-Platform
Contributeur à Symfony
@cDaed
@Simperfit
Bureau étendu AFUP
Les-Tilleuls.coop
Une coopérative depuis 2011
Appartient à 100% à ses employés
22 coopérateurs, 97% de croissance en 2016
On recrute à Amiens, Lille, Paris et Londres:
jobs@les-tilleuls.coop
Qu’est-ce que le
composant Workflow ?
Quelle est son utilité ?
Place Transition
A t0
Place
B
Un workflow classique
A t0 C
Un workflow
B t1 D
A t0a C
Une machine à état
B t1 D
t0b
A
t0a
C
Une machine à état
B
t0b
D
t1
La définition du Workflow
$definition = new Definition([
'completion_in_progress',
'to_validate',
'pending_search',
'found',
'started',
'finished',
], [
new Transition('to_validate',
['completion_in_progress'],
['to_validate']),
// etc
], 'completion_in_progress');
La definition du Workflow
workflows:
project:
type: 'state_machine'
marking_store:
type: single_state
arguments:
- status
supports:
- AppBundleEntityProject
places:
- !php/const:AppBundleEntityProject::STATUS_CREATED
- !php/const:AppBundleEntityProject::STATUS_TO_VALIDATE
- !php/const:AppBundleEntityProject::STATUS_VALIDATED
transitions:
to_validate:
from: !php/const:AppBundleEntityProject::STATUS_CREATED
to: !php/const:AppBundleEntityProject::STATUS_TO_VALIDATE
validated:
from: !php/const:AppBundleEntityProject::STATUS_TO_VALIDATE
to: !php/const:AppBundleEntityProject::STATUS_VALIDATED
Le graphviz :
bin/console workflow:dump project | dot -Tpng -o etc/project-graph.png
http://graphviz.org/download/
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.
Merci au Workflow !
Le composant nous permet de garantir que les projets
qui sont dans certains états ont bien passé toutes les
règles de validation.
Un workflow en prod
:
Le can()
Le apply()
Les events !
Les events !
public static function getSubscribedEvents(): array
{
return [
'workflow.project.enter.to_validate'=> ['assignUser'],
'workflow.project.entered.validated' => ['sendToLegacy'],
];
}
Le guard Event
use SymfonyComponentWorkflowEventGuardEvent;
use SymfonyComponentEventDispatcherEventSubscriberInterface;
class BlogPostReviewListener implements EventSubscriberInterface
{
public function guardReview(GuardEvent $event)
{
$post = $event->getSubject();
$title = $post->title;
if (empty($title)) {
// Posts with no title should not be allowed
$event->setBlocked(true);
}
}
public static function getSubscribedEvents()
{
return ['workflow.blogpost.guard.to_review' => ['guardReview']];
}
}
La vue
<h3>Actions</h3>
{% if workflow_can(post, 'publish') %}
<a href="...">Publish article</a>
{% endif %}
La vue
{# Or loop through the enabled transitions #}
{% for transition in workflow_transitions(post) %}
<a href="...">{{ transition.name }}</a>
{% endfor %}
L’utilisation au
quotidien
En mode API
On a plusieurs services qui mettent à jour le statut :
L’utilisateur à travers l’appli :
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
La « Legacy » qui transforme le projet en « found » lorsque le projet a
trouvé son artisan.
L’API elle-même qui transforme le projet en « pending_search » lorsque
qu’un appel à l’api « Legacy » est fait.
En mode API
private function checkStatusWorkflow(Project $data)
{
$content = json_decode($request->getContent(), true);
if (null === $status = $content['status'] ?? null
|| $userProject->getStatus() === $status) {
return;
}
if (true === $this->projectWorkflow->can($data, $status)) {
$this->projectWorkflow->apply($data, $status);
return;
}
throw new BadRequestHttpException('status.not_in_workflow');
}
Petite Démo
3.4 et 4.1
Une nouvelle interface…
Pour les gouverner tous !
À quoi ça sert ?
<?php
interface WorkflowInterface
{
public function getMarking($subject);
public function can($subject, $transitionName);
public function apply($subject, $transitionName);
public function getEnabledTransitions($subject);
public function getName();
public function getDefinition();
public function getMarkingStore();
}
Des questions ?
Maintenant :
…
Twitter : @cDaed
Merci à vous !
🍺🍺🍺🍺
Twitter : @cDaed
Merci à vous !
🍺🍺🍺🍺
Twitter : @cDaed
Les slides :

Contenu connexe

Similaire à Le composant Workflow de Symfony, c'est graphement bien.

SPA avec Angular et SignalR (FR)
SPA avec Angular et SignalR (FR)SPA avec Angular et SignalR (FR)
SPA avec Angular et SignalR (FR)Rui Carvalho
 
Votre première App SharePoint pour Office 365 avec Visual Studio !
Votre première App SharePoint pour Office 365 avec Visual Studio !Votre première App SharePoint pour Office 365 avec Visual Studio !
Votre première App SharePoint pour Office 365 avec Visual Studio !Gilles Pommier
 
yOS Montpellier - Piloter Office 365 grâce à powershell - Les indispensables
yOS Montpellier - Piloter Office 365 grâce à powershell - Les indispensablesyOS Montpellier - Piloter Office 365 grâce à powershell - Les indispensables
yOS Montpellier - Piloter Office 365 grâce à powershell - Les indispensablesBenoit Jester
 
Piloter Office 365 grâce à PowerShell - Les indispensables - Benoit Jester - ...
Piloter Office 365 grâce à PowerShell - Les indispensables - Benoit Jester - ...Piloter Office 365 grâce à PowerShell - Les indispensables - Benoit Jester - ...
Piloter Office 365 grâce à PowerShell - Les indispensables - Benoit Jester - ...Etienne Bailly
 
[Webinar] Techniques avancées de création de workflow - FR
[Webinar] Techniques avancées de création de workflow - FR[Webinar] Techniques avancées de création de workflow - FR
[Webinar] Techniques avancées de création de workflow - FRNuxeo
 
Enrichir vos contenus Wordpress avec les API - WPTech 2015
Enrichir vos contenus Wordpress avec les API - WPTech 2015Enrichir vos contenus Wordpress avec les API - WPTech 2015
Enrichir vos contenus Wordpress avec les API - WPTech 2015PXNetwork
 
Microsoft DevOps Day 2015 02122015 - L'expérience du groupe produit Xbox Music
Microsoft DevOps Day 2015 02122015 - L'expérience du groupe produit Xbox MusicMicrosoft DevOps Day 2015 02122015 - L'expérience du groupe produit Xbox Music
Microsoft DevOps Day 2015 02122015 - L'expérience du groupe produit Xbox MusicSamuel Metias
 
Refined, des types sur mesure
Refined, des types sur mesureRefined, des types sur mesure
Refined, des types sur mesureMohamad Kassir
 
Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...
Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...
Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...Jean-Laurent de Morlhon
 
Platform freelance ASP .NET / C#
Platform freelance ASP .NET / C# Platform freelance ASP .NET / C#
Platform freelance ASP .NET / C# Saâd Zerhouni
 
2018 06 nouvelles APIs checkpoint e-Xpert solutions
2018 06 nouvelles APIs checkpoint e-Xpert solutions2018 06 nouvelles APIs checkpoint e-Xpert solutions
2018 06 nouvelles APIs checkpoint e-Xpert solutionse-Xpert Solutions SA
 
Ma stack d'outils agiles, tout un programme !
Ma stack d'outils agiles, tout un programme !Ma stack d'outils agiles, tout un programme !
Ma stack d'outils agiles, tout un programme !Cédric Leblond
 
Développement Web sur iPhone (iPhone+iPad DevCamp Québec)
Développement Web sur iPhone (iPhone+iPad DevCamp Québec)Développement Web sur iPhone (iPhone+iPad DevCamp Québec)
Développement Web sur iPhone (iPhone+iPad DevCamp Québec)Rémi Prévost
 
Node, Grunt et leurs copains qui font de l’accessibilité tout seuls !
Node, Grunt et leurs copains qui font de l’accessibilité tout seuls !Node, Grunt et leurs copains qui font de l’accessibilité tout seuls !
Node, Grunt et leurs copains qui font de l’accessibilité tout seuls !vincent aniort
 
meetup devops aix-marseille - décembre 2023
meetup devops aix-marseille - décembre 2023meetup devops aix-marseille - décembre 2023
meetup devops aix-marseille - décembre 2023Frederic Leger
 
PowerShell pour Office 365 & SharePoint / yosTour Lyon / Gilles Pommier | Eti...
PowerShell pour Office 365 & SharePoint / yosTour Lyon / Gilles Pommier | Eti...PowerShell pour Office 365 & SharePoint / yosTour Lyon / Gilles Pommier | Eti...
PowerShell pour Office 365 & SharePoint / yosTour Lyon / Gilles Pommier | Eti...Etienne Bailly
 
Symposium n°7 : Plateforme Meteor
Symposium n°7 : Plateforme MeteorSymposium n°7 : Plateforme Meteor
Symposium n°7 : Plateforme MeteorArthurMaroulier
 

Similaire à Le composant Workflow de Symfony, c'est graphement bien. (20)

SPA avec Angular et SignalR (FR)
SPA avec Angular et SignalR (FR)SPA avec Angular et SignalR (FR)
SPA avec Angular et SignalR (FR)
 
Votre première App SharePoint pour Office 365 avec Visual Studio !
Votre première App SharePoint pour Office 365 avec Visual Studio !Votre première App SharePoint pour Office 365 avec Visual Studio !
Votre première App SharePoint pour Office 365 avec Visual Studio !
 
yOS Montpellier - Piloter Office 365 grâce à powershell - Les indispensables
yOS Montpellier - Piloter Office 365 grâce à powershell - Les indispensablesyOS Montpellier - Piloter Office 365 grâce à powershell - Les indispensables
yOS Montpellier - Piloter Office 365 grâce à powershell - Les indispensables
 
Piloter Office 365 grâce à PowerShell - Les indispensables - Benoit Jester - ...
Piloter Office 365 grâce à PowerShell - Les indispensables - Benoit Jester - ...Piloter Office 365 grâce à PowerShell - Les indispensables - Benoit Jester - ...
Piloter Office 365 grâce à PowerShell - Les indispensables - Benoit Jester - ...
 
[Webinar] Techniques avancées de création de workflow - FR
[Webinar] Techniques avancées de création de workflow - FR[Webinar] Techniques avancées de création de workflow - FR
[Webinar] Techniques avancées de création de workflow - FR
 
Enrichir vos contenus Wordpress avec les API - WPTech 2015
Enrichir vos contenus Wordpress avec les API - WPTech 2015Enrichir vos contenus Wordpress avec les API - WPTech 2015
Enrichir vos contenus Wordpress avec les API - WPTech 2015
 
Microsoft DevOps Day 2015 02122015 - L'expérience du groupe produit Xbox Music
Microsoft DevOps Day 2015 02122015 - L'expérience du groupe produit Xbox MusicMicrosoft DevOps Day 2015 02122015 - L'expérience du groupe produit Xbox Music
Microsoft DevOps Day 2015 02122015 - L'expérience du groupe produit Xbox Music
 
Refined, des types sur mesure
Refined, des types sur mesureRefined, des types sur mesure
Refined, des types sur mesure
 
Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...
Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...
Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...
 
Platform freelance ASP .NET / C#
Platform freelance ASP .NET / C# Platform freelance ASP .NET / C#
Platform freelance ASP .NET / C#
 
Workflow
WorkflowWorkflow
Workflow
 
HTML5
HTML5HTML5
HTML5
 
2018 06 nouvelles APIs checkpoint e-Xpert solutions
2018 06 nouvelles APIs checkpoint e-Xpert solutions2018 06 nouvelles APIs checkpoint e-Xpert solutions
2018 06 nouvelles APIs checkpoint e-Xpert solutions
 
Ma stack d'outils agiles, tout un programme !
Ma stack d'outils agiles, tout un programme !Ma stack d'outils agiles, tout un programme !
Ma stack d'outils agiles, tout un programme !
 
Développement Web sur iPhone (iPhone+iPad DevCamp Québec)
Développement Web sur iPhone (iPhone+iPad DevCamp Québec)Développement Web sur iPhone (iPhone+iPad DevCamp Québec)
Développement Web sur iPhone (iPhone+iPad DevCamp Québec)
 
Node, Grunt et leurs copains qui font de l’accessibilité tout seuls !
Node, Grunt et leurs copains qui font de l’accessibilité tout seuls !Node, Grunt et leurs copains qui font de l’accessibilité tout seuls !
Node, Grunt et leurs copains qui font de l’accessibilité tout seuls !
 
Meetup laravel
Meetup laravelMeetup laravel
Meetup laravel
 
meetup devops aix-marseille - décembre 2023
meetup devops aix-marseille - décembre 2023meetup devops aix-marseille - décembre 2023
meetup devops aix-marseille - décembre 2023
 
PowerShell pour Office 365 & SharePoint / yosTour Lyon / Gilles Pommier | Eti...
PowerShell pour Office 365 & SharePoint / yosTour Lyon / Gilles Pommier | Eti...PowerShell pour Office 365 & SharePoint / yosTour Lyon / Gilles Pommier | Eti...
PowerShell pour Office 365 & SharePoint / yosTour Lyon / Gilles Pommier | Eti...
 
Symposium n°7 : Plateforme Meteor
Symposium n°7 : Plateforme MeteorSymposium n°7 : Plateforme Meteor
Symposium n°7 : Plateforme Meteor
 

Le composant Workflow de Symfony, c'est graphement bien.

  • 1. Le composant workflow de Symfony, un truc graphement bien. Hamza Amrouche
  • 2. Hamza Amrouche Lead Dev Symfony chez Les-Tilleuls.coop Core Team Api-Platform Contributeur à Symfony @cDaed @Simperfit Bureau étendu AFUP
  • 3. Les-Tilleuls.coop Une coopérative depuis 2011 Appartient à 100% à ses employés 22 coopérateurs, 97% de croissance en 2016 On recrute à Amiens, Lille, Paris et Londres: jobs@les-tilleuls.coop
  • 5. Quelle est son utilité ?
  • 6. Place Transition A t0 Place B Un workflow classique
  • 7. A t0 C Un workflow B t1 D
  • 8. A t0a C Une machine à état B t1 D t0b
  • 9. A t0a C Une machine à état B t0b D t1
  • 10. La définition du Workflow $definition = new Definition([ 'completion_in_progress', 'to_validate', 'pending_search', 'found', 'started', 'finished', ], [ new Transition('to_validate', ['completion_in_progress'], ['to_validate']), // etc ], 'completion_in_progress');
  • 11. La definition du Workflow workflows: project: type: 'state_machine' marking_store: type: single_state arguments: - status supports: - AppBundleEntityProject places: - !php/const:AppBundleEntityProject::STATUS_CREATED - !php/const:AppBundleEntityProject::STATUS_TO_VALIDATE - !php/const:AppBundleEntityProject::STATUS_VALIDATED transitions: to_validate: from: !php/const:AppBundleEntityProject::STATUS_CREATED to: !php/const:AppBundleEntityProject::STATUS_TO_VALIDATE validated: from: !php/const:AppBundleEntityProject::STATUS_TO_VALIDATE to: !php/const:AppBundleEntityProject::STATUS_VALIDATED
  • 12. Le graphviz : bin/console workflow:dump project | dot -Tpng -o etc/project-graph.png http://graphviz.org/download/
  • 13. 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.
  • 14. Merci au Workflow ! Le composant nous permet de garantir que les projets qui sont dans certains états ont bien passé toutes les règles de validation.
  • 15. Un workflow en prod :
  • 19. Les events ! public static function getSubscribedEvents(): array { return [ 'workflow.project.enter.to_validate'=> ['assignUser'], 'workflow.project.entered.validated' => ['sendToLegacy'], ]; }
  • 20. Le guard Event use SymfonyComponentWorkflowEventGuardEvent; use SymfonyComponentEventDispatcherEventSubscriberInterface; class BlogPostReviewListener implements EventSubscriberInterface { public function guardReview(GuardEvent $event) { $post = $event->getSubject(); $title = $post->title; if (empty($title)) { // Posts with no title should not be allowed $event->setBlocked(true); } } public static function getSubscribedEvents() { return ['workflow.blogpost.guard.to_review' => ['guardReview']]; } }
  • 21. La vue <h3>Actions</h3> {% if workflow_can(post, 'publish') %} <a href="...">Publish article</a> {% endif %}
  • 22. La vue {# Or loop through the enabled transitions #} {% for transition in workflow_transitions(post) %} <a href="...">{{ transition.name }}</a> {% endfor %}
  • 24. En mode API On a plusieurs services qui mettent à jour le statut : L’utilisateur à travers l’appli : 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 La « Legacy » qui transforme le projet en « found » lorsque le projet a trouvé son artisan. L’API elle-même qui transforme le projet en « pending_search » lorsque qu’un appel à l’api « Legacy » est fait.
  • 25. En mode API private function checkStatusWorkflow(Project $data) { $content = json_decode($request->getContent(), true); if (null === $status = $content['status'] ?? null || $userProject->getStatus() === $status) { return; } if (true === $this->projectWorkflow->can($data, $status)) { $this->projectWorkflow->apply($data, $status); return; } throw new BadRequestHttpException('status.not_in_workflow'); }
  • 27.
  • 29. Une nouvelle interface… Pour les gouverner tous !
  • 30.
  • 31. À quoi ça sert ?
  • 32. <?php interface WorkflowInterface { public function getMarking($subject); public function can($subject, $transitionName); public function apply($subject, $transitionName); public function getEnabledTransitions($subject); public function getName(); public function getDefinition(); public function getMarkingStore(); }
  • 33. Des questions ? Maintenant : … Twitter : @cDaed
  • 34. Merci à vous ! 🍺🍺🍺🍺 Twitter : @cDaed
  • 35. Merci à vous ! 🍺🍺🍺🍺 Twitter : @cDaed Les slides :

Notes de l'éditeur

  1. ——-
  2. Le composant workflow est un composant qui a été introduit dans symfony en version 3.2 par Grégoire Pineau et Fabien Potencier. Il est donc déjà bien présent dans la version de 3 de symfony et va évolué avec les version 4.1 de symfony.
  3. Il va permettre par exemple de gérer des cas d’utilisations comme la publication d’articles sur un blog. L’article crée va avoir comme status « brouillon », lorsqu’il sera prêt l’article va passer en status « en attente d’approbation » afin que le relecteur relise l’article, une fois que cela est fait, l’article passera dans un status publié. Et derrière, tout cela on peut avoir une machine à états qui va faire la transitions et nous permettre de vérifié que lorsque l’article doit passer du status en attente d’approbation au status publié, via des règles de validation, qu’il y ai bien le bon nombre de relecteur, ici 1.
  4. Voici donc un workflow classique
  5. Dans ce cas, on est obliger de passer par t0 pour aller A ou B vers C tout en gardant la même transitions. même choses de B vers C ou D.
  6. La machine à états permet de transitionné aussi mais avec des transitions bien précise pour chaque états.
  7. On peut aussi représenté la machine a état comme ceci, cela va nous permettre ensuite de comprendre comment cela fonctionne avec le composant workflow.
  8. On a deux façon de définir notre configuration pour notre workflow, la première est vraiment en créeant les objets en PHP, donc notre objet Definition à 3 arguments, le premier étant les places possible, le second va contenir nos transitions, dans le cas présent, il s’agit de notre première transition de l’états complétion_in_progress à l’état to_validate, cette transition se nomme donc comme l’états d’arrivée, et on va voir plus tard pourquoi. Le 3éme arguments est l’états de base.
  9. Voici la configuration en YAML qui permet via Symfony de directement déclarer notre workflow. Ceci est un exemple qui rentre un peu plus dans les détails, avec le support de l’object et la declaration du marking_store, je ne reviens pas sur chaqu’une des clés on peut en discuté après, tout est dans la documentation de Symfony.
  10. Voici comment on va débug notre graph, via une commande qui est directement dans symfony va nous permettre de dumpé notre graph. On a avoir besoin de dot qui est inclue dans Graphviz
  11. Maintenant que vous savez comment déclarer votre workflow et comment le débugger, passons à sont utilisation réel dans un context projet qui est le context de Quotatis.
  12. Voici notre workflow en production chez quotatis, notre projet pourra toujours atteindre le status aborted car à tous moment du flow, il peut être annulé.
  13. Le can va nous permettre de savoir si on a le droit de passer d’un statut a un autre, dans le cas de notre status de base qui est completion_in_progress, on aura le droit d’effectuer une transition (donc can va retourner vrai) pour aller aux statues to_validate et aborted.
  14. Avant de faire un apply, normalement on fait un can(), donc dans ce cas comme dit juste avant, on peut effectuer la transition
  15. Bon, après avoir vue qu’est-ce qu’un workflow, à quoi ça sert, différent types de workflow et de machine à états, comment est-ce qu’on le définie, comment est-ce qu’on le dump en quelquechose de visuelle et comment on l’utilise, maintenant on va parler des événements ! Quand on transitionne ça déclenche des événements au moment de la transitions, On a plusieurs types d’événements, ces événements, on va pouvoir les écouté grâce a la gestions d’événements de symfony.
  16. L’utilisation au quotidien de notre Workflow avec Api-Platform et chez Quotatis, comme j’en ai parler tout à l’heure on a besoin du composant pour gérer l’états de nos projets.
  17. On as dans la 3.4 un nouvelle événement lorsque les transitions ont été effectué
  18. Vous vous souvenez de mon exemples sur les articles, et beh maintenant on a moins besoin des events, la logique peut être directement écrite dans votre propre implémentation de can().
  19. Et ça à été merger aujourd’hui !!! :p
  20. Donc comme je viens de le dire, cela va servir à gérer votre propre implémentation du can ou du apply.
  21. Si vous avez besoin de juste réimplement le can, l’idée ici et d’utiliser l’héritage, en implémentant l’interface et en héritant du composant.