diff --git a/src/Symfony/Component/Workflow/Tests/WorkflowTest.php b/src/Symfony/Component/Workflow/Tests/WorkflowTest.php index 8ef966666eeb..87f48002487d 100644 --- a/src/Symfony/Component/Workflow/Tests/WorkflowTest.php +++ b/src/Symfony/Component/Workflow/Tests/WorkflowTest.php @@ -345,6 +345,25 @@ public function testApplyWithSameNameTransition2() $this->assertTrue($marking->has('d')); } + public function testApplyWithSameNameTransition3() + { + $subject = new \stdClass(); + $subject->marking = array('a' => 1); + + $places = range('a', 'd'); + $transitions = array(); + $transitions[] = new Transition('t', 'a', 'b'); + $transitions[] = new Transition('t', 'b', 'c'); + $transitions[] = new Transition('t', 'c', 'd'); + $definition = new Definition($places, $transitions); + $workflow = new Workflow($definition, new MultipleStateMarkingStore()); + + $marking = $workflow->apply($subject, 't'); + // We want to make sure we do not end up in "d" + $this->assertTrue($marking->has('b')); + $this->assertFalse($marking->has('d')); + } + public function testApplyWithEventDispatcher() { $definition = $this->createComplexWorkflowDefinition(); diff --git a/src/Symfony/Component/Workflow/Workflow.php b/src/Symfony/Component/Workflow/Workflow.php index 963f1b8b2718..21676e0fc89a 100644 --- a/src/Symfony/Component/Workflow/Workflow.php +++ b/src/Symfony/Component/Workflow/Workflow.php @@ -139,6 +139,7 @@ public function apply($subject, $transitionName) $transitionBlockerList = null; $applied = false; + $approvedTransitionQueue = array(); foreach ($this->definition->getTransitions() as $transition) { if ($transition->getName() !== $transitionName) { @@ -149,7 +150,10 @@ public function apply($subject, $transitionName) if (!$transitionBlockerList->isEmpty()) { continue; } + $approvedTransitionQueue[] = $transition; + } + foreach ($approvedTransitionQueue as $transition) { $applied = true; $this->leave($subject, $transition, $marking);