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
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
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) %}
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