Skip to content

Commit a7ad1b4

Browse files
committed
Dispatching two events when a message is sent & handled
1 parent 6ff1185 commit a7ad1b4

File tree

3 files changed

+80
-2
lines changed

3 files changed

+80
-2
lines changed
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
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\Event;
13+
14+
use Symfony\Component\EventDispatcher\Event;
15+
use Symfony\Component\Messenger\Envelope;
16+
17+
/**
18+
* Event is dispatched before a message is sent to the transport.
19+
*
20+
* The event is *only* dispatched if the message will actually
21+
* be sent to at least one transport. If the message is sent
22+
* to multiple transports, the message is dispatched only one time.
23+
*
24+
* @author Ryan Weaver <ryan@symfonycasts.com>
25+
*/
26+
class SendMessageToTransportsEvent extends Event
27+
{
28+
private $envelope;
29+
30+
public function __construct(Envelope $envelope)
31+
{
32+
$this->envelope = $envelope;
33+
}
34+
35+
public function getEnvelope(): Envelope
36+
{
37+
return $this->envelope;
38+
}
39+
40+
public function setEnvelope(Envelope $envelope)
41+
{
42+
$this->envelope = $envelope;
43+
}
44+
}

src/Symfony/Component/Messenger/Middleware/SendMessageMiddleware.php

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@
1313

1414
use Psr\Log\LoggerAwareTrait;
1515
use Psr\Log\NullLogger;
16+
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
1617
use Symfony\Component\Messenger\Envelope;
18+
use Symfony\Component\Messenger\Event\SendMessageToTransportsEvent;
1719
use Symfony\Component\Messenger\Stamp\ReceivedStamp;
1820
use Symfony\Component\Messenger\Stamp\RedeliveryStamp;
1921
use Symfony\Component\Messenger\Stamp\SentStamp;
@@ -30,10 +32,12 @@ class SendMessageMiddleware implements MiddlewareInterface
3032
use LoggerAwareTrait;
3133

3234
private $sendersLocator;
35+
private $eventDispatcher;
3336

34-
public function __construct(SendersLocatorInterface $sendersLocator)
37+
public function __construct(SendersLocatorInterface $sendersLocator, EventDispatcherInterface $eventDispatcher = null)
3538
{
3639
$this->sendersLocator = $sendersLocator;
40+
$this->eventDispatcher = $eventDispatcher;
3741
$this->logger = new NullLogger();
3842
}
3943

@@ -58,7 +62,15 @@ public function handle(Envelope $envelope, StackInterface $stack): Envelope
5862
/** @var RedeliveryStamp|null $redeliveryStamp */
5963
$redeliveryStamp = $envelope->last(RedeliveryStamp::class);
6064

61-
foreach ($this->sendersLocator->getSenders($envelope, $handle) as $alias => $sender) {
65+
$senders = \iterator_to_array($this->sendersLocator->getSenders($envelope, $handle));
66+
67+
if (null !== $this->eventDispatcher && \count($senders) > 0) {
68+
$event = new SendMessageToTransportsEvent($envelope);
69+
$this->eventDispatcher->dispatch($event);
70+
$envelope = $event->getEnvelope();
71+
}
72+
73+
foreach ($senders as $alias => $sender) {
6274
// on redelivery, only deliver to the given sender
6375
if (null !== $redeliveryStamp && !$redeliveryStamp->shouldRedeliverToSender(\get_class($sender), $alias)) {
6476
continue;

src/Symfony/Component/Messenger/Tests/Middleware/SendMessageMiddlewareTest.php

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

1212
namespace Symfony\Component\Messenger\Tests\Middleware;
1313

14+
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
1415
use Symfony\Component\Messenger\Envelope;
16+
use Symfony\Component\Messenger\Event\SendMessageToTransportsEvent;
1517
use Symfony\Component\Messenger\Middleware\SendMessageMiddleware;
1618
use Symfony\Component\Messenger\Stamp\ReceivedStamp;
1719
use Symfony\Component\Messenger\Stamp\RedeliveryStamp;
@@ -202,4 +204,24 @@ public function testItSkipsReceivedMessages()
202204

203205
$this->assertNull($envelope->last(SentStamp::class), 'it does not add sent stamp for received messages');
204206
}
207+
208+
public function testItDispatchesTheEventOnceTime()
209+
{
210+
$envelope = new Envelope(new DummyMessage('original envelope'));
211+
212+
$dispatcher = $this->createMock(EventDispatcherInterface::class);
213+
$dispatcher->expects($this->once())
214+
->method('dispatch')
215+
->with(new SendMessageToTransportsEvent($envelope));
216+
217+
$sender1 = $this->getMockBuilder(SenderInterface::class)->getMock();
218+
$sender2 = $this->getMockBuilder(SenderInterface::class)->getMock();
219+
220+
$middleware = new SendMessageMiddleware(new SendersLocator([DummyMessage::class => [$sender1, $sender2]]), $dispatcher);
221+
222+
$sender1->expects($this->once())->method('send')->willReturn($envelope);
223+
$sender2->expects($this->once())->method('send')->willReturn($envelope);
224+
225+
$middleware->handle($envelope, $this->getStackMock(false));
226+
}
205227
}

0 commit comments

Comments
 (0)