8000 [Workflow] Fixed marking state on leave and enter events · symfony/symfony@083fbd1 · GitHub
[go: up one dir, main page]

Skip to content

Commit 083fbd1

Browse files
committed
[Workflow] Fixed marking state on leave and enter events
1 parent cc5c233 commit 083fbd1

File tree

2 files changed

+72
-11
lines changed

2 files changed

+72
-11
lines changed

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

Lines changed: 60 additions & 0 deletions
10000
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,65 @@ public function testApplyWithEventDispatcher()
252253
$this->assertSame($eventNameExpected, $eventDispatcher->dispatchedEvents);
253254
}
254255

256+
public function testMarkingStateOnApplyWithEventDispatcher()
257+
{
258+
$definition = new Definition(array('a', 'b', 'c', 'd', 'e', 'f'), array(
259+
new Transition('t', array('a', 'b', 'c'), array('d', 'e', 'f')),
260+
));
261+
262+
$initialState = array('a' => 1, 'b' => 1, 'c' => 1);
263+
$transitionState = array();
264+
$finalState = array('d' => 1, 'e' => 1, 'f' => 1);
265+
266+
$subject = new \stdClass();
267+
$subject->marking = $initialState;
268+
269+
$dispatcher = new EventDispatcher();
270+
$dispatcher->addListener('workflow.leave', function (Event $event) use ($initialState) {
271+
$this->assertEquals(new Marking($initialState), $event->getMarking());
272+
});
273+
$dispatcher->addListener('workflow.test.leave', function (Event $event) use ($initialState) {
274+
$this->assertEquals(new Marking($initialState), $event->getMarking());
275+
});
276+
$dispatcher->addListener('workflow.test.leave.a', function (Event $event) use ($initialState) {
277+
$this->assertEquals(new Marking($initialState), $event->getMarking());
278+
});
279+
$dispatcher->addListener('workflow.test.leave.b', function (Event $event) use ($initialState) {
280+
$this->assertEquals(new Marking($initialState), $event->getMarking());
281+
});
282+
$dispatcher->addListener('workflow.test.leave.c', function (Event $event) use ($initialState) {
283+
$this->assertEquals(new Marking($initialState), $event->getMarking());
284+
});
285+
$dispatcher->addListener('workflow.transition', function (Event $event) use ($transitionState) {
286+
$this->assertEquals(new Marking($transitionState), $event->getMarking());
287+
});
288+
$dispatcher->addListener('workflow.test.transition', function (Event $event) use ($transitionState) {
289+
$this->assertEquals(new Marking($transitionState), $event->getMarking());
290+
});
291+
$dispatcher->addListener('workflow.test.transition.t', function (Event $event) use ($transitionState) {
292+
$this->assertEquals(new Marking($transitionState), $event->getMarking());
293+
});
294+
$dispatcher->addListener('workflow.enter', function (Event $event) use ($finalState) {
295+
$this->assertEquals(new Marking($finalState), $event->getMarking());
296+
});
297+
$dispatcher->addListener('workflow.test.enter', function (Event $event) use ($finalState) {
298+
$this->assertEquals(new Marking($finalState), $event->getMarking());
299+
});
300+
$dispatcher->addListener('workflow.test.enter.d', function (Event $event) use ($finalState) {
301+
$this->assertEquals(new Marking($finalState), $event->getMarking());
302+
});
303+
$dispatcher->addListener('workflow.test.enter.e', function (Event $event) use ($finalState) {
304+
$this->assertEquals(new Marking($finalState), $event->getMarking());
305+
});
306+
$dispatcher->addListener('workflow.test.enter.f', function (Event $event) use ($finalState) {
307+
$this->assertEquals(new Marking($finalState), $event->getMarking());
308+
});
309+
310+
$workflow = new Workflow($definition, new MultipleStateMarkingStore(), $dispatcher, 'test');
311+
312+
$workflow->apply($subject, 't');
313+
}
314+
255315
public function testGetEnabledTransitions()
256316
{
257317
$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)
0