Skip to content

Commit 8f0da1c

Browse files
Rework
1 parent 70d6d27 commit 8f0da1c

File tree

10 files changed

+97
-17
lines changed

10 files changed

+97
-17
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2300,6 +2300,7 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
23002300

23012301
$defaultMiddleware = [
23022302
'before' => [
2303+
['id' => 'add_self_stampable_stamps_middleware'],
23032304
['id' => 'add_bus_name_stamp_middleware'],
23042305
['id' => 'reject_redelivered_message_middleware'],
23052306
['id' => 'dispatch_after_current_bus'],
@@ -2325,7 +2326,7 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
23252326
$defaultMiddleware['after'][1]['arguments'] = [$bus['default_middleware']['allow_no_handlers']];
23262327

23272328
// argument to add_bus_name_stamp_middleware
2328-
$defaultMiddleware['before'][0]['arguments'] = [$busId];
2329+
$defaultMiddleware['before'][1]['arguments'] = [$busId];
23292330

23302331
$middleware = array_merge($defaultMiddleware['before'], $middleware, $defaultMiddleware['after']);
23312332
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
use Symfony\Component\Messenger\EventListener\StopWorkerOnRestartSignalListener;
2626
use Symfony\Component\Messenger\Handler\RedispatchMessageHandler;
2727
use Symfony\Component\Messenger\Middleware\AddBusNameStampMiddleware;
28+
use Symfony\Component\Messenger\Middleware\AddSelfStampableStampsMiddleware;
2829
use Symfony\Component\Messenger\Middleware\DeduplicateMiddleware;
2930
use Symfony\Component\Messenger\Middleware\DispatchAfterCurrentBusMiddleware;
3031
use Symfony\Component\Messenger\Middleware\FailedMessageProcessingMiddleware;
@@ -92,6 +93,8 @@
9293
service('lock.factory'),
9394
])
9495

96+
->set('messenger.middleware.add_self_stampable_stamps_middleware', AddSelfStampableStampsMiddleware::class)
97+
9598
->set('messenger.middleware.add_bus_name_stamp_middleware', AddBusNameStampMiddleware::class)
9699
->abstract()
97100

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1064,6 +1064,7 @@ public function testMessengerWithMultipleBusesWithoutDeduplicateMiddleware()
10641064
$this->assertTrue($container->has('messenger.bus.commands'));
10651065
$this->assertSame([], $container->getDefinition('messenger.bus.commands')->getArgument(0));
10661066
$this->assertEquals([
1067+
['id' => 'add_self_stampable_stamps_middleware'],
10671068
['id' => 'add_bus_name_stamp_middleware', 'arguments' => ['messenger.bus.commands']],
10681069
['id' => 'reject_redelivered_message_middleware'],
10691070
['id' => 'dispatch_after_current_bus'],
@@ -1104,6 +1105,7 @@ public function testMessengerWithMultipleBusesWithDeduplicateMiddleware()
11041105
$this->assertTrue($container->has('messenger.bus.commands'));
11051106
$this->assertSame([], $container->getDefinition('messenger.bus.commands')->getArgument(0));
11061107
$this->assertEquals([
1108+
['id' => 'add_self_stampable_stamps_middleware'],
11071109
['id' => 'add_bus_name_stamp_middleware', 'arguments' => ['messenger.bus.commands']],
11081110
['id' => 'reject_redelivered_message_middleware'],
11091111
['id' => 'dispatch_after_current_bus'],

src/Symfony/Component/Messenger/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ CHANGELOG
77
* Add `CloseableTransportInterface` to allow closing the transport
88
* Add `SentForRetryStamp` that identifies whether a failed message was sent for retry
99
* Add `Symfony\Component\Messenger\Middleware\DeduplicateMiddleware` and `Symfony\Component\Messenger\Stamp\DeduplicateStamp`
10+
* Add `Symfony\Component\Messenger\Middleware\AddSelfStampableStampsMiddleware` and `Symfony\Component\Messenger\Message\SelfStampableInterface`
1011

1112
7.2
1213
---

src/Symfony/Component/Messenger/Message/SelfStampableInterface.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@
1616
interface SelfStampableInterface
1717
{
1818
/**
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+
*
1922
* @return array<StampInterface>
2023
*/
21-
public function getStamps(): array;
24+
public function getDefaultStamps(): array;
2225
}

src/Symfony/Component/Messenger/MessageBus.php

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111

1212
namespace Symfony\Component\Messenger;
1313

14-
use Symfony\Component\Messenger\Message\SelfStampableInterface;
1514
use Symfony\Component\Messenger\Middleware\MiddlewareInterface;
1615
use Symfony\Component\Messenger\Middleware\StackMiddleware;
1716

@@ -54,10 +53,6 @@ public function getIterator(): \Traversable
5453

5554
public function dispatch(object $message, array $stamps = []): Envelope
5655
{
57-
if ($message instanceof SelfStampableInterface) {
58-
$stamps = array_merge($message->getStamps(), $stamps);
59-
}
60-
6156
$envelope = Envelope::wrap($message, $stamps);
6257
$middlewareIterator = $this->middlewareAggregate->getIterator();
6358

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 <fabien@symfony.com>
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\SelfStampableInterface;
16+
17+
/**
18+
* Automatically add stamps from the SelfStampableInterface.
19+
*/
20+
class AddSelfStampableStampsMiddleware implements MiddlewareInterface
21+
{
22+
public function handle(Envelope $envelope, StackInterface $stack): Envelope
23+
{
24+
$message = $envelope->getMessage();
25+
if ($message instanceof SelfStampableInterface) {
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+
}

src/Symfony/Component/Messenger/Tests/Fixtures/SelfStampableDummyMessage.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public function getMessage(): string
1616
return $this->message;
1717
}
1818

19-
public function getStamps(): array
19+
public function getDefaultStamps(): array
2020
{
2121
return [new DelayStamp(1)];
2222
}

src/Symfony/Component/Messenger/Tests/MessageBusTest.php

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
use Symfony\Component\Messenger\Stamp\ReceivedStamp;
2323
use Symfony\Component\Messenger\Tests\Fixtures\AnEnvelopeStamp;
2424
use Symfony\Component\Messenger\Tests\Fixtures\DummyMessage;
25-
use Symfony\Component\Messenger\Tests\Fixtures\SelfStampableDummyMessage;
2625

2726
class MessageBusTest extends TestCase
2827
{
@@ -134,14 +133,6 @@ public function testItAddsTheStampsToEnvelope()
134133
$this->assertCount(2, $finalEnvelope->all());
135134
}
136135

137-
public function testSelfStampableMessage()
138-
{
139-
$finalEnvelope = (new MessageBus())->dispatch(new SelfStampableDummyMessage(''), [new DelayStamp(5), new BusNameStamp('bar')]);
140-
$this->assertCount(2, $finalEnvelope->all());
141-
$this->assertCount(2, $finalEnvelope->all()[DelayStamp::class]);
142-
$this->assertSame(5, $finalEnvelope->last(DelayStamp::class)->getDelay());
143-
}
144-
145136
public static function provideConstructorDataStucture(): iterable
146137
{
147138
yield 'iterator' => [new \ArrayObject([
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 <fabien@symfony.com>
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\AddSelfStampableStampsMiddleware;
16+
use Symfony\Component\Messenger\Stamp\DelayStamp;
17+
use Symfony\Component\Messenger\Test\Middleware\MiddlewareTestCase;
18+
use Symfony\Component\Messenger\Tests\Fixtures\SelfStampableDummyMessage;
19+
20+
final class AddSelfStampableStampsMiddlewareTest extends MiddlewareTestCase
21+
{
22+
public function testSelfStampableStampsMiddleware()
23+
{
24+
$message = new SelfStampableDummyMessage('');
25+
$envelope = new Envelope($message);
26+
27+
$decorator = new AddSelfStampableStampsMiddleware();
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 SelfStampableDummyMessage('');
39+
$envelope = new Envelope($message, [new DelayStamp(5)]);
40+
41+
$decorator = new AddSelfStampableStampsMiddleware();
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)