From 175858a67e46a47cf61d16153ed09e8d18612c0d Mon Sep 17 00:00:00 2001 From: HeahDude Date: Sun, 5 Mar 2017 21:06:20 +0100 Subject: [PATCH] [Workflow] Fixed marking state on leave and enter events --- .../Component/Workflow/Tests/WorkflowTest.php | 36 +++++++++++++++++++ src/Symfony/Component/Workflow/Workflow.php | 24 +++++++------ 2 files changed, 50 insertions(+), 10 deletions(-) diff --git a/src/Symfony/Component/Workflow/Tests/WorkflowTest.php b/src/Symfony/Component/Workflow/Tests/WorkflowTest.php index b1fc9b0039..ab8c767b59 100644 --- a/src/Symfony/Component/Workflow/Tests/WorkflowTest.php +++ b/src/Symfony/Component/Workflow/Tests/WorkflowTest.php @@ -5,6 +5,7 @@ namespace Symfony\Component\Workflow\Tests; use PHPUnit\Framework\TestCase; use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Component\Workflow\Definition; +use Symfony\Component\Workflow\Event\Event; use Symfony\Component\Workflow\Event\GuardEvent; use Symfony\Component\Workflow\Marking; use Symfony\Component\Workflow\MarkingStore\MarkingStoreInterface; @@ -252,6 +253,41 @@ class WorkflowTest extends TestCase $this->assertSame($eventNameExpected, $eventDispatcher->dispatchedEvents); } + public function testMarkingStateOnApplyWithEventDispatcher() + { + $definition = new Definition(range('a', 'f'), array(new Transition('t', range('a', 'c'), range('d', 'f')))); + + $subject = new \stdClass(); + $subject->marking = array('a' => 1, 'b' => 1, 'c' => 1); + + $dispatcher = new EventDispatcher(); + + $workflow = new Workflow($definition, new MultipleStateMarkingStore(), $dispatcher, 'test'); + + $assertInitialState = function (Event $event) { + $this->assertEquals(new Marking(array('a' => 1, 'b' => 1, 'c' => 1)), $event->getMarking()); + }; + $assertTransitionState = function (Event $event) { + $this->assertEquals(new Marking(array()), $event->getMarking()); + }; + + $dispatcher->addListener('workflow.leave', $assertInitialState); + $dispatcher->addListener('workflow.test.leave', $assertInitialState); + $dispatcher->addListener('workflow.test.leave.a', $assertInitialState); + $dispatcher->addListener('workflow.test.leave.b', $assertInitialState); + $dispatcher->addListener('workflow.test.leave.c', $assertInitialState); + $dispatcher->addListener('workflow.transition', $assertTransitionState); + $dispatcher->addListener('workflow.test.transition', $assertTransitionState); + $dispatcher->addListener('workflow.test.transition.t', $assertTransitionState); + $dispatcher->addListener('workflow.enter', $assertTransitionState); + $dispatcher->addListener('workflow.test.enter', $assertTransitionState); + $dispatcher->addListener('workflow.test.enter.d', $assertTransitionState); + $dispatcher->addListener('workflow.test.enter.e', $assertTransitionState); + $dispatcher->addListener('workflow.test.enter.f', $assertTransitionState); + + $workflow->apply($subject, 't'); + } + public function testGetEnabledTransitions() { $definition = $this->createComplexWorkflowDefinition(); diff --git a/src/Symfony/Component/Workflow/Workflow.php b/src/Symfony/Component/Workflow/Workflow.php index 14801086bb..ec49895a3c 100644 --- a/src/Symfony/Component/Workflow/Workflow.php +++ b/src/Symfony/Component/Workflow/Workflow.php @@ -223,20 +223,22 @@ class Workflow private function leave($subject, Transition $transition, Marking $marking) { + $places = $transition->getFroms(); + if (null !== $this->dispatcher) { $event = new Event($subject, $marking, $transition); $this->dispatcher->dispatch('workflow.leave', $event); $this->dispatcher->dispatch(sprintf('workflow.%s.leave', $this->name), $event); - } - foreach ($transition->getFroms() as $place) { - $marking->unmark($place); - - if (null !== $this->dispatcher) { + foreach ($places as $place) { $this->dispatcher->dispatch(sprintf('workflow.%s.leave.%s', $this->name, $place), $event); } } + + foreach ($places as $place) { + $marking->unmark($place); + } } private function transition($subject, Transition $transition, Marking $marking) @@ -254,20 +256,22 @@ class Workflow private function enter($subject, Transition $transition, Marking $marking) { + $places = $transition->getTos(); + if (null !== $this->dispatcher) { $event = new Event($subject, $marking, $transition); $this->dispatcher->dispatch('workflow.enter', $event); $this->dispatcher->dispatch(sprintf('workflow.%s.enter', $this->name), $event); - } - foreach ($transition->getTos() as $place) { - $marking->mark($place); - - if (null !== $this->dispatcher) { + foreach ($places as $place) { $this->dispatcher->dispatch(sprintf('workflow.%s.enter.%s', $this->name, $place), $event); } } + + foreach ($places as $place) { + $marking->mark($place); + } } private function announce($subject, Transition $initialTransition, Marking $marking)