From ae60a8b8e181cb75f7de1d2d2075dbd5c99ae76c Mon Sep 17 00:00:00 2001 From: Giso Stallenberg Date: Tue, 17 Dec 2024 11:22:13 +0100 Subject: [PATCH] Preserve context in non guard events The context was not always preserved in non guard events. --- src/Events/BaseEvent.php | 41 ++++++++++++++++++++++++++------------- src/Events/GuardEvent.php | 7 +------ 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/src/Events/BaseEvent.php b/src/Events/BaseEvent.php index 341e28a..0ac384a 100644 --- a/src/Events/BaseEvent.php +++ b/src/Events/BaseEvent.php @@ -4,6 +4,7 @@ use Workflow; use Symfony\Component\Workflow\Event\Event; +use Symfony\Component\Workflow\Event\GuardEvent as SymfonyGuardEvent; /** * @method \Symfony\Component\Workflow\Marking getMarking() @@ -17,7 +18,7 @@ abstract class BaseEvent extends Event { public function __serialize(): array { - return [ + $result = [ 'base_event_class' => get_class($this), 'subject' => $this->getSubject(), 'marking' => $this->getMarking(), @@ -26,17 +27,26 @@ public function __serialize(): array 'name' => $this->getWorkflowName(), ], ]; + if (!$this instanceof GuardEvent) { + $result['context'] = $this->getContext(); + } + + return $result; } public function __unserialize(array $data): void { $workflowName = $data['workflow']['name'] ?? null; - parent::__construct( - $data['subject'], - $data['marking'], - $data['transition'], - Workflow::get($data['subject'], $workflowName) - ); + + $arguments = [ + ...$data, + 'workflow' => Workflow::get($data['subject'], $workflowName), + ]; + if (!$this instanceof GuardEvent) { + $arguments['context'] = $data['context']; + } + + parent::__construct(...$arguments); } /** @@ -44,11 +54,16 @@ public function __unserialize(array $data): void */ public static function newFromBase(Event $symfonyEvent) { - return new static( - $symfonyEvent->getSubject(), - $symfonyEvent->getMarking(), - $symfonyEvent->getTransition(), - $symfonyEvent->getWorkflow() - ); + $arguments = [ + 'subject' => $symfonyEvent->getSubject(), + 'marking' => $symfonyEvent->getMarking(), + 'transition' => $symfonyEvent->getTransition(), + 'workflow' => $symfonyEvent->getWorkflow(), + ]; + if (!$symfonyEvent instanceof SymfonyGuardEvent) { + $arguments['context'] = $symfonyEvent->getContext(); + } + + return new static(...$arguments); } } diff --git a/src/Events/GuardEvent.php b/src/Events/GuardEvent.php index 2e60d8d..2535a5f 100644 --- a/src/Events/GuardEvent.php +++ b/src/Events/GuardEvent.php @@ -52,12 +52,7 @@ public function __unserialize(array $data): void */ public static function newFromBase(Event $symfonyEvent) { - $instance = new static( - $symfonyEvent->getSubject(), - $symfonyEvent->getMarking(), - $symfonyEvent->getTransition(), - $symfonyEvent->getWorkflow() - ); + $instance = parent::newFromBase($symfonyEvent); $instance->symfonyProxyEvent = $symfonyEvent;