Skip to content

Commit db6206e

Browse files
committed
feature symfony#54366 [Messenger] Introduce DefaultStampsProviderInterface (VincentLanglet)
This PR was squashed before being merged into the 7.4 branch. Discussion ---------- [Messenger] Introduce `DefaultStampsProviderInterface ` | Q | A | ------------- | --- | Branch? | 7.4 | Bug fix? | no | New feature? | yes | Deprecations? | no <!-- please update UPGRADE-*.md and src/**/CHANGELOG.md files --> | Issues | Fix #... <!-- prefix each issue number with "Fix #", no need to create an issue if none exists, explain below instead --> | License | MIT Idea was kinda suggested from symfony#54141 (comment) This interface would allow to define stamp I always want by default with a message. By merging in the order ```php array_merge($message->getStamps(), $stamps); ``` I can still override a stamp when dispatching the message. Commits ------- 5605e0d [Messenger] Introduce `DefaultStampsProviderInterface `
2 parents 9e4ca15 + 5605e0d commit db6206e

File tree

9 files changed

+148
-2
lines changed

9 files changed

+148
-2
lines changed

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@
134134
use Symfony\Component\Messenger\Handler\BatchHandlerInterface;
135135
use Symfony\Component\Messenger\MessageBus;
136136
use Symfony\Component\Messenger\MessageBusInterface;
137+
use Symfony\Component\Messenger\Middleware\AddDefaultStampsMiddleware;
137138
use Symfony\Component\Messenger\Middleware\DeduplicateMiddleware;
138139
use Symfony\Component\Messenger\Middleware\RouterContextMiddleware;
139140
use Symfony\Component\Messenger\Transport\AmqpExt\AmqpTransportFactory;
@@ -2436,6 +2437,10 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
24362437
],
24372438
];
24382439

2440+
if (class_exists(AddDefaultStampsMiddleware::class)) {
2441+
array_unshift($defaultMiddleware['before'], ['id' => 'add_default_stamps_middleware']);
2442+
}
2443+
24392444
if ($lockEnabled && class_exists(DeduplicateMiddleware::class) && class_exists(LockFactory::class)) {
24402445
$defaultMiddleware['before'][] = ['id' => 'deduplicate_middleware'];
24412446
} else {

src/Symfony/Bundle/FrameworkBundle/Resources/config/messenger.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
use Symfony\Component\Messenger\EventListener\StopWorkerOnRestartSignalListener;
2727
use Symfony\Component\Messenger\Handler\RedispatchMessageHandler;
2828
use Symfony\Component\Messenger\Middleware\AddBusNameStampMiddleware;
29+
use Symfony\Component\Messenger\Middleware\AddDefaultStampsMiddleware;
2930
use Symfony\Component\Messenger\Middleware\DeduplicateMiddleware;
3031
use Symfony\Component\Messenger\Middleware\DispatchAfterCurrentBusMiddleware;
3132
use Symfony\Component\Messenger\Middleware\FailedMessageProcessingMiddleware;
@@ -93,6 +94,8 @@
9394
service('lock.factory'),
9495
])
9596

97+
->set('messenger.middleware.add_default_stamps_middleware', AddDefaultStampsMiddleware::class)
98+
9699
->set('messenger.middleware.add_bus_name_stamp_middleware', AddBusNameStampMiddleware::class)
97100
->abstract()
98101

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTestCase.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1090,6 +1090,7 @@ public function testMessengerWithMultipleBusesWithoutDeduplicateMiddleware()
10901090
$this->assertTrue($container->has('messenger.bus.commands'));
10911091
$this->assertSame([], $container->getDefinition('messenger.bus.commands')->getArgument(0));
10921092
$this->assertEquals([
1093+
['id' => 'add_default_stamps_middleware'],
10931094
['id' => 'add_bus_name_stamp_middleware', 'arguments' => ['messenger.bus.commands']],
10941095
['id' => 'reject_redelivered_message_middleware'],
10951096
['id' => 'dispatch_after_current_bus'],
@@ -1100,6 +1101,7 @@ public function testMessengerWithMultipleBusesWithoutDeduplicateMiddleware()
11001101
$this->assertTrue($container->has('messenger.bus.events'));
11011102
$this->assertSame([], $container->getDefinition('messenger.bus.events')->getArgument(0));
11021103
$this->assertEquals([
1104+
['id' => 'add_default_stamps_middleware'],
11031105
['id' => 'add_bus_name_stamp_middleware', 'arguments' => ['messenger.bus.events']],
11041106
['id' => 'reject_redelivered_message_middleware'],
11051107
['id' => 'dispatch_after_current_bus'],
@@ -1132,6 +1134,7 @@ public function testMessengerWithAddBusNameStampMiddleware()
11321134
$this->assertTrue($container->has('messenger.bus.events'));
11331135
$this->assertSame([], $container->getDefinition('messenger.bus.events')->getArgument(0));
11341136
$this->assertEquals([
1137+
['id' => 'add_default_stamps_middleware'],
11351138
['id' => 'add_bus_name_stamp_middleware', 'arguments' => ['messenger.bus.events']],
11361139
['id' => 'reject_redelivered_message_middleware'],
11371140
['id' => 'dispatch_after_current_bus'],
@@ -1152,6 +1155,7 @@ public function testMessengerWithMultipleBusesWithDeduplicateMiddleware()
11521155
$this->assertTrue($container->has('messenger.bus.commands'));
11531156
$this->assertSame([], $container->getDefinition('messenger.bus.commands')->getArgument(0));
11541157
$this->assertEquals([
1158+
['id' => 'add_default_stamps_middleware'],
11551159
['id' => 'add_bus_name_stamp_middleware', 'arguments' => ['messenger.bus.commands']],
11561160
['id' => 'reject_redelivered_message_middleware'],
11571161
['id' => 'dispatch_after_current_bus'],
@@ -1163,6 +1167,7 @@ public function testMessengerWithMultipleBusesWithDeduplicateMiddleware()
11631167
$this->assertTrue($container->has('messenger.bus.events'));
11641168
$this->assertSame([], $container->getDefinition('messenger.bus.events')->getArgument(0));
11651169
$this->assertEquals([
1170+
['id' => 'add_default_stamps_middleware'],
11661171
['id' => 'add_bus_name_stamp_middleware', 'arguments' => ['messenger.bus.events']],
11671172
['id' => 'reject_redelivered_message_middleware'],
11681173
['id' => 'dispatch_after_current_bus'],

src/Symfony/Bundle/FrameworkBundle/composer.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
"symfony/http-client": "^6.4|^7.0|^8.0",
5353
"symfony/lock": "^6.4|^7.0|^8.0",
5454
"symfony/mailer": "^6.4|^7.0|^8.0",
55-
"symfony/messenger": "^6.4|^7.0|^8.0",
55+
"symfony/messenger": "^7.4|^8.0",
5656
"symfony/mime": "^6.4|^7.0|^8.0",
5757
"symfony/notifier": "^6.4|^7.0|^8.0",
5858
"symfony/object-mapper": "^7.3|^8.0",
@@ -93,7 +93,7 @@
9393
"symfony/form": "<6.4",
9494
"symfony/lock": "<6.4",
9595
"symfony/mailer": "<6.4",
96-
"symfony/messenger": "<6.4",
96+
"symfony/messenger": "<7.4",
9797
"symfony/mime": "<6.4",
9898
"symfony/property-info": "<6.4",
9999
"symfony/property-access": "<6.4",

src/Symfony/Component/Messenger/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ CHANGELOG
66

77
* Add `--exclude-receivers` option to the `messenger:consume command`
88
* Allow any `ServiceResetterInterface` implementation in `ResetServicesListener`
9+
* Add `Symfony\Component\Messenger\Middleware\AddDefaultStampsMiddleware` and `Symfony\Component\Messenger\Message\DefaultStampsProviderInterface`
910

1011
7.3
1112
---
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <[email protected]>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\Messenger\Message;
13+
14+
use Symfony\Component\Messenger\Stamp\StampInterface;
15+
16+
interface DefaultStampsProviderInterface
17+
{
18+
/**
19+
* List of stamps which will be automatically added to the envelope,
20+
* if there is no other stamp of the same class already set.
21+
*
22+
* @return array<StampInterface>
23+
*/
24+
public function getDefaultStamps(): array;
25+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <[email protected]>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\Messenger\Middleware;
13+
14+
use Symfony\Component\Messenger\Envelope;
15+
use Symfony\Component\Messenger\Message\DefaultStampsProviderInterface;
16+
17+
/**
18+
* Automatically add stamps from the DefaultStampsProviderInterface.
19+
*/
20+
class AddDefaultStampsMiddleware implements MiddlewareInterface
21+
{
22+
public function handle(Envelope $envelope, StackInterface $stack): Envelope
23+
{
24+
$message = $envelope->getMessage();
25+
if ($message instanceof DefaultStampsProviderInterface) {
26+
foreach ($message->getDefaultStamps() as $stamp) {
27+
if (null === $envelope->last($stamp::class)) {
28+
$envelope = $envelope->with($stamp);
29+
}
30+
}
31+
}
32+
33+
return $stack->next()->handle($envelope, $stack);
34+
}
35+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
namespace Symfony\Component\Messenger\Tests\Fixtures;
4+
5+
use Symfony\Component\Messenger\Message\DefaultStampsProviderInterface;
6+
use Symfony\Component\Messenger\Stamp\DelayStamp;
7+
8+
class DefaultStampsProviderDummyMessage implements DummyMessageInterface, DefaultStampsProviderInterface
9+
{
10+
public function __construct(private string $message)
11+
{
12+
}
13+
14+
public function getMessage(): string
15+
{
16+
return $this->message;
17+
}
18+
19+
public function getDefaultStamps(): array
20+
{
21+
return [new DelayStamp(1)];
22+
}
23+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <[email protected]>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\Messenger\Tests\Middleware;
13+
14+
use Symfony\Component\Messenger\Envelope;
15+
use Symfony\Component\Messenger\Middleware\AddDefaultStampsMiddleware;
16+
use Symfony\Component\Messenger\Stamp\DelayStamp;
17+
use Symfony\Component\Messenger\Test\Middleware\MiddlewareTestCase;
18+
use Symfony\Component\Messenger\Tests\Fixtures\DefaultStampsProviderDummyMessage;
19+
20+
final class AddDefaultStampsMiddlewareTest extends MiddlewareTestCase
21+
{
22+
public function testSelfStampableStampsMiddleware()
23+
{
24+
$message = new DefaultStampsProviderDummyMessage('');
25+
$envelope = new Envelope($message);
26+
27+
$decorator = new AddDefaultStampsMiddleware();
28+
29+
$envelope = $decorator->handle($envelope, $this->getStackMock(true));
30+
31+
$delayStamp = $envelope->last(DelayStamp::class);
32+
$this->assertNotNull($delayStamp);
33+
$this->assertSame(1, $delayStamp->getDelay());
34+
}
35+
36+
public function testSelfStampableStampsMiddlewareIfStampExists()
37+
{
38+
$message = new DefaultStampsProviderDummyMessage('');
39+
$envelope = new Envelope($message, [new DelayStamp(5)]);
40+
41+
$decorator = new AddDefaultStampsMiddleware();
42+
43+
$envelope = $decorator->handle($envelope, $this->getStackMock(true));
44+
45+
$delayStamp = $envelope->last(DelayStamp::class);
46+
$this->assertNotNull($delayStamp);
47+
$this->assertSame(5, $delayStamp->getDelay());
48+
}
49+
}

0 commit comments

Comments
 (0)