Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 5295be1

Browse files
committed
[Workflow] Fixed marking state on leave and enter events
1 parent 94d059d commit 5295be1

File tree

2 files changed

+51
-11
lines changed

2 files changed

+51
-11
lines changed

src/Symfony/Component/Workflow/Tests/WorkflowTest.php

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use PHPUnit\Framework\TestCase;
66
use Symfony\Component\EventDispatcher\EventDispatcher;
77
use Symfony\Component\Workflow\Definition;
8+
use Symfony\Component\Workflow\Event\Event;
89
use Symfony\Component\Workflow\Event\GuardEvent;
910
use Symfony\Component\Workflow\Marking;
1011
use Symfony\Component\Workflow\MarkingStore\MarkingStoreInterface;
@@ -252,6 +253,44 @@ public function testApplyWithEventDispatcher()
252253
$this->assertSame($eventNameExpected, $eventDispatcher->dispatchedEvents);
253254
}
254255

256+
public function testMarkingStateOnApplyWithEventDispatcher()
257+
{
258+
$definition = new Definition(range('a', 'f'), array(new Transition('t', range('a', 'c'), range('d', 'f'))));
259+
260+
$subject = new \stdClass();
261+
$subject->marking = array('a' => 1, 'b' => 1, 'c' => 1);
262+
263+
$dispatcher = new EventDispatcher();
264+
265+
$workflow = new Workflow($definition, new MultipleStateMarkingStore(), $dispatcher, 'test');
266+
267+
$assertInitialState = function (Event $event) {
268+
$this->assertEquals(new Marking(array('a' => 1, 'b' => 1, 'c' => 1)), $event->getMarking());
269+
};
270+
$assertTransitionState = function (Event $event) {
271+
$this->assertEquals(new Marking(array()), $event->getMarking());
272+
};
273+
$assertFinalState = function (Event $event) {
274+
$this->assertEquals(new Marking(array('d' => 1, 'e' => 1, 'f' => 1)), $event->getMarking());
275+
};
276+
277+
$dispatcher->addListener('workflow.leave', $assertInitialState);
278+
$dispatcher->addListener('workflow.test.leave', $assertInitialState);
279+
$dispatcher->addListener('workflow.test.leave.a', $assertInitialState);
280+
$dispatcher->addListener('workflow.test.leave.b', $assertInitialState);
281+
$dispatcher->addListener('workflow.test.leave.c', $assertInitialState);
282+
$dispatcher->addListener('workflow.transition', $assertTransitionState);
283+
$dispatcher->addListener('workflow.test.transition', $assertTransitionState);
284+
$dispatcher->addListener('workflow.test.transition.t', $assertTransitionState);
285+
$dispatcher->addListener('workflow.enter', $assertFinalState);
286+
$dispatcher->addListener('workflow.test.enter', $assertFinalState);
287+
$dispatcher->addListener('workflow.test.enter.d', $assertFinalState);
288+
$dispatcher->addListener('workflow.test.enter.e', $assertFinalState);
289+
$dispatcher->addListener('workflow.test.enter.f', $assertFinalState);
290+
291+
$workflow->apply($subject, 't');
292+
}
293+
255294
public function testGetEnabledTransitions()
256295
{
257296
$definition = $this->createComplexWorkflowDefinition();

src/Symfony/Component/Workflow/Workflow.php

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -223,20 +223,22 @@ private function guardTransition($subject, Marking $marking, Transition $transit
223223

224224
private function leave($subject, Transition $transition, Marking $marking)
225225
{
226+
$places = $transition->getFroms();
227+
226228
if (null !== $this->dispatcher) {
227229
$event = new Event($subject, $marking, $transition);
228230

229231
$this->dispatcher->dispatch('workflow.leave', $event);
230232
$this->dispatcher->dispatch(sprintf('workflow.%s.leave', $this->name), $event);
231-
}
232-
233-
foreach ($transition->getFroms() as $place) {
234-
$marking->unmark($place);
235233

236-
if (null !== $this->dispatcher) {
234+
foreach ($places as $place) {
237235
$this->dispatcher->dispatch(sprintf('workflow.%s.leave.%s', $this->name, $place), $event);
238236
}
239237
}
238+
239+
foreach ($places as $place) {
240+
$marking->unmark($place);
241+
}
240242
}
241243

242244
private function transition($subject, Transition $transition, Marking $marking)
@@ -254,17 +256,16 @@ private function transition($subject, Transition $transition, Marking $marking)
254256

255257
private function enter($subject, Transition $transition, Marking $marking)
256258
{
259+
foreach ($places = $transition->getTos() as $place) {
260+
$marking->mark($place);
261+
}
262+
257263
if (null !== $this->dispatcher) {
258264
$event = new Event($subject, $marking, $transition);
259-
260265
$this->dispatcher->dispatch('workflow.enter', $event);
261266
$this->dispatcher->dispatch(sprintf('workflow.%s.enter', $this->name), $event);
262-
}
263-
264-
foreach ($transition->getTos() as $place) {
265-
$marking->mark($place);
266267

267-
if (null !== $this->dispatcher) {
268+
foreach ($places as $place) {
268269
$this->dispatcher->dispatch(sprintf('workflow.%s.enter.%s', $this->name, $place), $event);
269270
}
270271
}

0 commit comments

Comments
 (0)