diff --git a/src/Symfony/Component/Workflow/CHANGELOG.md b/src/Symfony/Component/Workflow/CHANGELOG.md index d1b50cb4ef497..02c04f6dc08f6 100644 --- a/src/Symfony/Component/Workflow/CHANGELOG.md +++ b/src/Symfony/Component/Workflow/CHANGELOG.md @@ -5,6 +5,7 @@ CHANGELOG ----- * Added support for `Event::getWorkflowName()` for "announce" events. + * Added `workflow.completed` events which are fired after a transition is completed. 3.3.0 ----- diff --git a/src/Symfony/Component/Workflow/Tests/WorkflowTest.php b/src/Symfony/Component/Workflow/Tests/WorkflowTest.php index 45dcbc73ccb62..547fb03e82cfe 100644 --- a/src/Symfony/Component/Workflow/Tests/WorkflowTest.php +++ b/src/Symfony/Component/Workflow/Tests/WorkflowTest.php @@ -287,6 +287,9 @@ public function testApplyWithEventDispatcher() 'workflow.workflow_name.entered', 'workflow.workflow_name.entered.b', 'workflow.workflow_name.entered.c', + 'workflow.completed', + 'workflow.workflow_name.completed', + 'workflow.workflow_name.completed.t1', // Following events are fired because of announce() method 'workflow.announce', 'workflow.workflow_name.announce', diff --git a/src/Symfony/Component/Workflow/Workflow.php b/src/Symfony/Component/Workflow/Workflow.php index 31c830fcee906..d3d18f03746a7 100644 --- a/src/Symfony/Component/Workflow/Workflow.php +++ b/src/Symfony/Component/Workflow/Workflow.php @@ -151,6 +151,8 @@ public function apply($subject, $transitionName) $this->entered($subject, $transition, $marking); + $this->completed($subject, $transition, $marking); + $this->announce($subject, $transition, $marking); } @@ -309,6 +311,19 @@ private function entered($subject, Transition $transition, Marking $marking) } } + private function completed($subject, Transition $transition, Marking $marking) + { + if (null === $this->dispatcher) { + return; + } + + $event = new Event($subject, $marking, $transition, $this->name); + + $this->dispatcher->dispatch('workflow.completed', $event); + $this->dispatcher->dispatch(sprintf('workflow.%s.completed', $this->name), $event); + $this->dispatcher->dispatch(sprintf('workflow.%s.completed.%s', $this->name, $transition->getName()), $event); + } + private function announce($subject, Transition $initialTransition, Marking $marking) { if (null === $this->dispatcher) {