From 858faf0174e2875751dca8953a9285586c2724a6 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Wed, 27 May 2026 17:16:02 +0300 Subject: [PATCH] Deny `Envelope::fromData()` usage --- src/Message/DelayEnvelope.php | 7 -- src/Message/Envelope.php | 8 ++- src/Message/IdEnvelope.php | 19 ------ .../FailureHandling/FailureEnvelope.php | 8 --- tests/App/DummyEnvelope.php | 5 -- tests/Benchmark/MetadataBench.php | 33 --------- tests/Unit/Message/DelayEnvelopeTest.php | 18 ----- tests/Unit/Message/EnvelopeTest.php | 26 ------- tests/Unit/Message/IdEnvelopeTest.php | 68 ------------------- .../FailureHandling/FailureEnvelopeTest.php | 39 ----------- 10 files changed, 5 insertions(+), 226 deletions(-) delete mode 100644 tests/Unit/Message/EnvelopeTest.php diff --git a/src/Message/DelayEnvelope.php b/src/Message/DelayEnvelope.php index 39525f63..8d6e18ec 100644 --- a/src/Message/DelayEnvelope.php +++ b/src/Message/DelayEnvelope.php @@ -13,13 +13,6 @@ public function __construct(MessageInterface $message, float $delaySeconds) parent::__construct($message, [self::META_DELAY_SECONDS => $delaySeconds]); } - public static function fromMessage(MessageInterface $message): static - { - /** @var float|int|string $delaySeconds */ - $delaySeconds = $message->getMetadata()[self::META_DELAY_SECONDS] ?? 0.0; - return new self($message, (float) $delaySeconds); - } - public function getDelaySeconds(): float { return $this->metadata[self::META_DELAY_SECONDS]; diff --git a/src/Message/Envelope.php b/src/Message/Envelope.php index ef1a2ab6..cd144a77 100644 --- a/src/Message/Envelope.php +++ b/src/Message/Envelope.php @@ -4,6 +4,8 @@ namespace Yiisoft\Queue\Message; +use LogicException; + abstract class Envelope implements MessageInterface { /** @@ -25,11 +27,11 @@ public function __construct(MessageInterface $message, array $metadata) final public static function fromData(string $type, mixed $data, array $metadata = []): static { - return static::fromMessage(Message::fromData($type, $data, $metadata)); + throw new LogicException( + 'Envelopes cannot be created via "fromData()". Wrap an existing "MessageInterface" instance instead.', + ); } - abstract public static function fromMessage(MessageInterface $message): static; - final public function getMessage(): MessageInterface { return $this->message; diff --git a/src/Message/IdEnvelope.php b/src/Message/IdEnvelope.php index d6216d70..b89a94da 100644 --- a/src/Message/IdEnvelope.php +++ b/src/Message/IdEnvelope.php @@ -4,10 +4,6 @@ namespace Yiisoft\Queue\Message; -use function is_int; -use function is_object; -use function is_string; - /** * ID envelope allows to identify a message. */ @@ -20,21 +16,6 @@ public function __construct(MessageInterface $message, string|int|null $id) parent::__construct($message, [self::MESSAGE_ID_KEY => $id]); } - public static function fromMessage(MessageInterface $message): static - { - $rawId = $message->getMetadata()[self::MESSAGE_ID_KEY] ?? null; - - $id = match (true) { - $rawId === null => null, // don't remove this branch: it's important for compute speed - is_string($rawId), - is_int($rawId) => $rawId, - is_object($rawId) && method_exists($rawId, '__toString') => (string) $rawId, - default => null, - }; - - return new self($message, $id); - } - public function getId(): string|int|null { return $this->metadata[self::MESSAGE_ID_KEY]; diff --git a/src/Middleware/FailureHandling/FailureEnvelope.php b/src/Middleware/FailureHandling/FailureEnvelope.php index 56075a86..743a754b 100644 --- a/src/Middleware/FailureHandling/FailureEnvelope.php +++ b/src/Middleware/FailureHandling/FailureEnvelope.php @@ -18,12 +18,4 @@ public function __construct(MessageInterface $message, array $metadata = []) self::FAILURE_META_KEY => ArrayHelper::merge($message->getMetadata()[self::FAILURE_META_KEY] ?? [], $metadata), ]); } - - public static function fromMessage(MessageInterface $message): static - { - /** @var array $metadata */ - $metadata = $message->getMetadata()[self::FAILURE_META_KEY] ?? []; - - return new self($message, $metadata); - } } diff --git a/tests/App/DummyEnvelope.php b/tests/App/DummyEnvelope.php index e92fbeec..b8bd1525 100644 --- a/tests/App/DummyEnvelope.php +++ b/tests/App/DummyEnvelope.php @@ -13,9 +13,4 @@ public function __construct(MessageInterface $message) { parent::__construct($message, []); } - - public static function fromMessage(MessageInterface $message): static - { - return new self($message); - } } diff --git a/tests/Benchmark/MetadataBench.php b/tests/Benchmark/MetadataBench.php index e60565f6..73aad883 100644 --- a/tests/Benchmark/MetadataBench.php +++ b/tests/Benchmark/MetadataBench.php @@ -31,39 +31,6 @@ public function benchEnvelopeRead(): void $id = $message->getId(); } - /** - * Create metadata as an array and read its value from an envelope object. - */ - public function benchEnvelopeReadRestored(): void - { - $message = IdEnvelope::fromMessage(new Message('foo', 'bar', ['id' => 1])); - $id = $message->getId(); - } - - public function provideEnvelopeStack(): Generator - { - $config = [1 => 'one', 5 => 'five', 15 => 'fifteen']; - $message = new IdEnvelope(new Message('foo', 'bar'), 1); - - for ($i = 1; $i <= max(...array_keys($config)); $i++) { - if (isset($config[$i])) { - yield $config[$i] => ['message' => $message]; - } - $message = new FailureEnvelope($message, ["fail$i" => "fail$i"]); - } - } - - /** - * Read metadata value from an envelope object restored from an envelope stacks of different depth - * - * @psalm-param array{message: MessageInterface} $params - */ - #[ParamProviders('provideEnvelopeStack')] - public function benchEnvelopeReadFromStack(array $params): void - { - $id = IdEnvelope::fromMessage($params['message'])->getId(); - } - public function provideEnvelopeStackCounts(): Generator { yield 'one' => [1]; diff --git a/tests/Unit/Message/DelayEnvelopeTest.php b/tests/Unit/Message/DelayEnvelopeTest.php index 100cf768..a50daa80 100644 --- a/tests/Unit/Message/DelayEnvelopeTest.php +++ b/tests/Unit/Message/DelayEnvelopeTest.php @@ -24,22 +24,4 @@ public function testDelayEnvelope(): void self::assertArrayHasKey(DelayEnvelope::META_DELAY_SECONDS, $metadata); self::assertSame(300.5, $metadata[DelayEnvelope::META_DELAY_SECONDS]); } - - public function testFromMessage(): void - { - $message = new Message('test', ['data' => 'value'], [DelayEnvelope::META_DELAY_SECONDS => 150]); - $delayEnvelope = DelayEnvelope::fromMessage($message); - - self::assertSame(150.0, $delayEnvelope->getDelaySeconds()); - self::assertSame('test', $delayEnvelope->getType()); - self::assertSame(['data' => 'value'], $delayEnvelope->getData()); - } - - public function testFromMessageWithoutDelay(): void - { - $message = new Message('test', ['data' => 'value']); - $delayEnvelope = DelayEnvelope::fromMessage($message); - - self::assertSame(0.0, $delayEnvelope->getDelaySeconds()); - } } diff --git a/tests/Unit/Message/EnvelopeTest.php b/tests/Unit/Message/EnvelopeTest.php deleted file mode 100644 index 67ba1d2e..00000000 --- a/tests/Unit/Message/EnvelopeTest.php +++ /dev/null @@ -1,26 +0,0 @@ - 'value']; - $metadata = ['meta' => 'data']; - - $envelope = DummyEnvelope::fromData($type, $data, $metadata); - - $this->assertInstanceOf(DummyEnvelope::class, $envelope); - $this->assertSame($type, $envelope->getType()); - $this->assertSame($data, $envelope->getData()); - $this->assertArrayHasKey('meta', $envelope->getMetadata()); - $this->assertSame('data', $envelope->getMetadata()['meta']); - } -} diff --git a/tests/Unit/Message/IdEnvelopeTest.php b/tests/Unit/Message/IdEnvelopeTest.php index a45f6465..9dcc48cc 100644 --- a/tests/Unit/Message/IdEnvelopeTest.php +++ b/tests/Unit/Message/IdEnvelopeTest.php @@ -22,58 +22,6 @@ public function testConstructor(): void $this->assertSame($id, $envelope->getId()); } - public function testFromMessageWithStringId(): void - { - $id = 'test-id'; - $message = $this->createMessage([IdEnvelope::MESSAGE_ID_KEY => $id]); - - $envelope = IdEnvelope::fromMessage($message); - - $this->assertSame($id, $envelope->getId()); - } - - public function testFromMessageWithIntId(): void - { - $id = 123; - $message = $this->createMessage([IdEnvelope::MESSAGE_ID_KEY => $id]); - - $envelope = IdEnvelope::fromMessage($message); - - $this->assertSame($id, $envelope->getId()); - } - - public function testFromMessageWithNullId(): void - { - $message = $this->createMessage(); - - $envelope = IdEnvelope::fromMessage($message); - - $this->assertNull($envelope->getId()); - } - - public function testFromMessageWithObjectHavingToString(): void - { - $stringableObject = new class { - public function __toString(): string - { - return 'object-id'; - } - }; - $message = $this->createMessage([IdEnvelope::MESSAGE_ID_KEY => $stringableObject]); - $envelope = IdEnvelope::fromMessage($message); - - $this->assertSame('object-id', $envelope->getId()); - } - - public function testFromMessageWithInvalidIdType(): void - { - $invalidId = ['array-cannot-be-id']; - $message = $this->createMessage([IdEnvelope::MESSAGE_ID_KEY => $invalidId]); - $message = IdEnvelope::fromMessage($message); - - $this->assertNull($message->getId()); - } - public function testGetEnvelopeMetadata(): void { $id = 'test-id'; @@ -86,22 +34,6 @@ public function testGetEnvelopeMetadata(): void $this->assertSame($id, $metadata[IdEnvelope::MESSAGE_ID_KEY]); } - public function testFromData(): void - { - $type = 'test-handler'; - $data = ['key' => 'value']; - $metadata = ['meta' => 'data', IdEnvelope::MESSAGE_ID_KEY => 'test-id']; - - $envelope = IdEnvelope::fromData($type, $data, $metadata); - - $this->assertInstanceOf(IdEnvelope::class, $envelope); - $this->assertSame($type, $envelope->getType()); - $this->assertSame($data, $envelope->getData()); - $this->assertArrayHasKey('meta', $envelope->getMetadata()); - $this->assertSame('data', $envelope->getMetadata()['meta']); - $this->assertSame('test-id', $envelope->getId()); - } - private function createMessage(array $metadata = []): MessageInterface { return new Message('test-handler', ['test-data'], $metadata); diff --git a/tests/Unit/Middleware/FailureHandling/FailureEnvelopeTest.php b/tests/Unit/Middleware/FailureHandling/FailureEnvelopeTest.php index b34c9081..01158be3 100644 --- a/tests/Unit/Middleware/FailureHandling/FailureEnvelopeTest.php +++ b/tests/Unit/Middleware/FailureHandling/FailureEnvelopeTest.php @@ -23,26 +23,6 @@ public function testConstructor(): void $this->assertSame($metadata, $envelope->getMetadata()[FailureEnvelope::FAILURE_META_KEY]); } - public function testFromMessageWithExistingMetadata(): void - { - $existingMetadata = ['attempt' => 1]; - $message = $this->createMessage([FailureEnvelope::FAILURE_META_KEY => $existingMetadata]); - - $envelope = FailureEnvelope::fromMessage($message); - - $this->assertSame($existingMetadata, $envelope->getMetadata()[FailureEnvelope::FAILURE_META_KEY]); - } - - public function testFromMessageWithoutMetadata(): void - { - $message = $this->createMessage(); - - $envelope = FailureEnvelope::fromMessage($message); - - $this->assertArrayHasKey(FailureEnvelope::FAILURE_META_KEY, $envelope->getMetadata()); - $this->assertSame([], $envelope->getMetadata()[FailureEnvelope::FAILURE_META_KEY]); - } - public function testMetadataMerging(): void { $existingMetadata = ['attempt' => 1, 'firstError' => 'First error']; @@ -57,25 +37,6 @@ public function testMetadataMerging(): void $this->assertSame('Last error', $mergedMetadata['lastError']); } - public function testFromData(): void - { - $type = 'test-handler'; - $data = ['key' => 'value']; - $metadata = [ - 'meta' => 'data', - FailureEnvelope::FAILURE_META_KEY => ['attempt' => 1], - ]; - - $envelope = FailureEnvelope::fromData($type, $data, $metadata); - - $this->assertInstanceOf(FailureEnvelope::class, $envelope); - $this->assertSame($type, $envelope->getType()); - $this->assertSame($data, $envelope->getData()); - $this->assertArrayHasKey('meta', $envelope->getMetadata()); - $this->assertSame('data', $envelope->getMetadata()['meta']); - $this->assertSame(['attempt' => 1], $envelope->getMetadata()[FailureEnvelope::FAILURE_META_KEY]); - } - private function createMessage(array $metadata = []): MessageInterface { return new Message('test-handler', ['test-data'], $metadata);