diff --git a/src/Symfony/Component/Workflow/CHANGELOG.md b/src/Symfony/Component/Workflow/CHANGELOG.md index b62bacf97c939..69b9096a0bbfc 100644 --- a/src/Symfony/Component/Workflow/CHANGELOG.md +++ b/src/Symfony/Component/Workflow/CHANGELOG.md @@ -1,6 +1,11 @@ CHANGELOG ========= +5.4 +--- + + * Add support for getting updated context after a transition + 5.3 --- diff --git a/src/Symfony/Component/Workflow/Marking.php b/src/Symfony/Component/Workflow/Marking.php index 974a040b0d74f..4396c2f374112 100644 --- a/src/Symfony/Component/Workflow/Marking.php +++ b/src/Symfony/Component/Workflow/Marking.php @@ -19,6 +19,7 @@ class Marking { private $places = []; + private $context = null; /** * @param int[] $representation Keys are the place name and values should be 1 @@ -49,4 +50,20 @@ public function getPlaces() { return $this->places; } + + /** + * @internal + */ + public function setContext(array $context): void + { + $this->context = $context; + } + + /** + * Returns the context after the subject has transitioned. + */ + public function getContext(): ?array + { + return $this->context; + } } diff --git a/src/Symfony/Component/Workflow/Tests/WorkflowTest.php b/src/Symfony/Component/Workflow/Tests/WorkflowTest.php index 9e4a486c346f6..6eca532331d03 100644 --- a/src/Symfony/Component/Workflow/Tests/WorkflowTest.php +++ b/src/Symfony/Component/Workflow/Tests/WorkflowTest.php @@ -637,7 +637,28 @@ public function testEventContext() $dispatcher->addListener($eventName, $assertWorkflowContext); } - $workflow->apply($subject, 't1', $context); + $marking = $workflow->apply($subject, 't1', $context); + + $this->assertInstanceOf(Marking::class, $marking); + $this->assertSame($context, $marking->getContext()); + } + + public function testEventContextUpdated() + { + $definition = $this->createComplexWorkflowDefinition(); + $subject = new Subject(); + $dispatcher = new EventDispatcher(); + + $workflow = new Workflow($definition, new MethodMarkingStore(), $dispatcher); + + $dispatcher->addListener('workflow.transition', function (TransitionEvent $event) { + $event->setContext(['foo' => 'bar']); + }); + + $marking = $workflow->apply($subject, 't1', ['initial']); + + $this->assertInstanceOf(Marking::class, $marking); + $this->assertSame(['foo' => 'bar'], $marking->getContext()); } public function testEventDefaultInitialContext() diff --git a/src/Symfony/Component/Workflow/Workflow.php b/src/Symfony/Component/Workflow/Workflow.php index 5b45c1f7c77c8..12a0bab57a040 100644 --- a/src/Symfony/Component/Workflow/Workflow.php +++ b/src/Symfony/Component/Workflow/Workflow.php @@ -244,6 +244,8 @@ public function apply(object $subject, string $transitionName, array $context = $this->announce($subject, $transition, $marking, $context); } + $marking->setContext($context); + return $marking; }