Skip to content

Commit 56367dc

Browse files
committed
Introduce abstract Message class
1 parent 1a8ba57 commit 56367dc

54 files changed

Lines changed: 242 additions & 256 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

docs/guide/en/configuration-manual.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ $queue = new Queue(
7979
);
8080

8181
// Now you can push messages
82-
$message = new \Yiisoft\Queue\Message\Message('file-download', ['url' => 'https://example.com/file.pdf']);
82+
$message = new \Yiisoft\Queue\Message\SimpleMessage('file-download', ['url' => 'https://example.com/file.pdf']);
8383
$queue->push($message);
8484
```
8585

docs/guide/en/message-handler-advanced.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ Handler definitions are configured in:
1717
Use a short stable message type when pushing a `Message` instead of a PHP class name:
1818

1919
```php
20-
use Yiisoft\Queue\Message\Message;
20+
use Yiisoft\Queue\Message\SimpleMessage;
2121

22-
new Message('send-email', ['data' => '...']); // "send-email" is the message type here
22+
new SimpleMessage('send-email', ['data' => '...']); // "send-email" is the message type here
2323
```
2424

2525
**Config**:

docs/guide/en/message-handler.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ If your handler implements `Yiisoft\Queue\Message\MessageHandlerInterface`, you
1313
**Message**:
1414

1515
```php
16-
new \Yiisoft\Queue\Message\Message(\App\Queue\RemoteFileHandler::class, ['url' => '...']);
16+
new \Yiisoft\Queue\Message\SimpleMessage(\App\Queue\RemoteFileHandler::class, ['url' => '...']);
1717
```
1818

1919
**Handler**:

docs/guide/en/messages-and-handlers.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ This means the producer and consumer can be:
3333
A message carries just enough data to perform the work:
3434

3535
```php
36-
new \Yiisoft\Queue\Message\Message('send-email', [
36+
new \Yiisoft\Queue\Message\SimpleMessage('send-email', [
3737
'to' => 'user@example.com',
3838
'subject' => 'Welcome',
3939
]);

docs/guide/en/queue-names.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ Pushing a message via DI:
6868

6969
```php
7070
use Yiisoft\Queue\QueueInterface;
71-
use Yiisoft\Queue\Message\Message;
71+
use Yiisoft\Queue\Message\SimpleMessage;
7272

7373
final readonly class SendWelcomeEmail
7474
{
@@ -78,7 +78,7 @@ final readonly class SendWelcomeEmail
7878

7979
public function run(string $email): void
8080
{
81-
$this->queue->push(new Message('send-email', ['to' => $email]));
81+
$this->queue->push(new SimpleMessage('send-email', ['to' => $email]));
8282
}
8383
}
8484
```
@@ -105,7 +105,7 @@ If you have multiple queue names, inject `QueueProviderInterface` and call `get(
105105

106106
```php
107107
use Yiisoft\Queue\Provider\QueueProviderInterface;
108-
use Yiisoft\Queue\Message\Message;
108+
use Yiisoft\Queue\Message\SimpleMessage;
109109

110110
final readonly class SendTransactionalEmail
111111
{
@@ -117,7 +117,7 @@ final readonly class SendTransactionalEmail
117117
{
118118
$this->queueProvider
119119
->get('emails')
120-
->push(new Message('send-email', ['to' => $email]));
120+
->push(new SimpleMessage('send-email', ['to' => $email]));
121121
}
122122
}
123123
```

docs/guide/en/usage.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
For example, if you need to download and save a file, you can create a message like this:
66

77
```php
8-
$message = new \Yiisoft\Queue\Message\Message(
8+
$message = new \Yiisoft\Queue\Message\SimpleMessage(
99
RemoteFileHandler::class,
1010
['url' => $url, 'destinationFile' => $filename]
1111
);

src/Message/Envelope.php

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
namespace Yiisoft\Queue\Message;
66

7+
use LogicException;
8+
79
abstract class Envelope implements MessageInterface
810
{
911
/**
@@ -23,9 +25,11 @@ public function __construct(MessageInterface $message, array $metadata)
2325
$this->message = $message;
2426
}
2527

26-
final public static function fromData(string $type, mixed $data, array $metadata = []): static
28+
final public static function fromData(string $type, mixed $data): static
2729
{
28-
return static::fromMessage(Message::fromData($type, $data, $metadata));
30+
throw new LogicException(
31+
'Envelopes cannot be created via "fromData()". Wrap an existing "MessageInterface" instance instead.',
32+
);
2933
}
3034

3135
abstract public static function fromMessage(MessageInterface $message): static;
@@ -49,4 +53,9 @@ final public function getMetadata(): array
4953
{
5054
return $this->metadata;
5155
}
56+
57+
final public function withMetadata(array $metadata): static
58+
{
59+
return static::fromMessage($this->message->withMetadata($metadata));
60+
}
5261
}

src/Message/JsonMessageSerializer.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,15 +54,15 @@ public function unserialize(string $value): MessageInterface
5454
throw new InvalidArgumentException('Metadata must be an array. Got ' . get_debug_type($meta) . '.');
5555
}
5656

57-
$class = $meta['message-class'] ?? Message::class;
57+
$class = $meta['message-class'] ?? SimpleMessage::class;
5858
// Don't check subclasses when it's a default class: that's faster
59-
if ($class !== Message::class && !is_subclass_of($class, MessageInterface::class)) {
60-
$class = Message::class;
59+
if ($class !== SimpleMessage::class && !is_subclass_of($class, MessageInterface::class)) {
60+
$class = SimpleMessage::class;
6161
}
6262

6363
/**
6464
* @var class-string<MessageInterface> $class
6565
*/
66-
return $class::fromData($type, $payload['data'] ?? null, $meta);
66+
return $class::fromData($type, $payload['data'] ?? null)->withMetadata($meta);
6767
}
6868
}

src/Message/Message.php

Lines changed: 9 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,38 +4,22 @@
44

55
namespace Yiisoft\Queue\Message;
66

7-
final class Message implements MessageInterface
7+
abstract class Message implements MessageInterface
88
{
99
/**
10-
* @param string $type A message type used to resolve the handler.
11-
* @param mixed $data Message data, encodable by a queue adapter
12-
* @param array $metadata Message metadata, encodable by a queue adapter
13-
*
14-
* @psalm-param array<string, mixed> $metadata
10+
* @psalm-var array<string, mixed>
1511
*/
16-
public function __construct(
17-
private readonly string $type,
18-
private readonly mixed $data,
19-
private array $metadata = [],
20-
) {}
12+
private array $metadata = [];
2113

22-
public static function fromData(string $type, mixed $data, array $metadata = []): MessageInterface
14+
final public function getMetadata(): array
2315
{
24-
return new self($type, $data, $metadata);
25-
}
26-
27-
public function getType(): string
28-
{
29-
return $this->type;
30-
}
31-
32-
public function getData(): mixed
33-
{
34-
return $this->data;
16+
return $this->metadata;
3517
}
3618

37-
public function getMetadata(): array
19+
final public function withMetadata(array $metadata): static
3820
{
39-
return $this->metadata;
21+
$new = clone $this;
22+
$new->metadata = $metadata;
23+
return $new;
4024
}
4125
}

src/Message/MessageInterface.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
interface MessageInterface
88
{
9-
public static function fromData(string $type, mixed $data, array $metadata = []): self;
9+
public static function fromData(string $type, mixed $data): self;
1010

1111
/**
1212
* Returns message type.
@@ -24,4 +24,11 @@ public function getData(): mixed;
2424
* @return array<string, mixed>
2525
*/
2626
public function getMetadata(): array;
27+
28+
/**
29+
* Returns a new instance with the given message metadata.
30+
*
31+
* @param array<string, mixed> $metadata
32+
*/
33+
public function withMetadata(array $metadata): static;
2734
}

0 commit comments

Comments
 (0)