Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 49d3c46

Browse files
committed
Dispatching two events when a message is sent & handled
1 parent 522594a commit 49d3c46

File tree

4 files changed

+85
-1
lines changed

4 files changed

+85
-1
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 <[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\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 <[email protected]>
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: 15 additions & 1 deletion
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\SentStamp;
1921
use Symfony\Component\Messenger\Transport\Sender\SendersLocatorInterface;
@@ -29,10 +31,12 @@ class SendMessageMiddleware implements MiddlewareInterface
2931
use LoggerAwareTrait;
3032

3133
private $sendersLocator;
34+
private $eventDispatcher;
3235

33-
public function __construct(SendersLocatorInterface $sendersLocator)
36+
public function __construct(SendersLocatorInterface $sendersLocator, EventDispatcherInterface $eventDispatcher = null)
3437
{
3538
$this->sendersLocator = $sendersLocator;
39+
$this->eventDispatcher = $eventDispatcher;
3640
$this->logger = new NullLogger();
3741
}
3842

@@ -54,8 +58,18 @@ public function handle(Envelope $envelope, StackInterface $stack): Envelope
5458
// it's a received message, do not send it back
5559
$this->logger->info('Received message "{class}"', $context);
5660
} else {
61+
$messageDispatched = false;
5762
foreach ($this->sendersLocator->getSenders($envelope, $handle) as $alias => $sender) {
5863
$this->logger->info('Sending message "{class}" with "{sender}"', $context + ['sender' => \get_class($sender)]);
64+
65+
if (null !== $this->eventDispatcher && false === $messageDispatched) {
66+
$messageDispatched = true;
67+
68+
$event = new SendMessageToTransportsEvent($envelope);
69+
$this->eventDispatcher->dispatch($event);
70+
$envelope = $event->getEnvelope();
71+
}
72+
5973
$envelope = $sender->send($envelope)->with(new SentStamp(\get_class($sender), \is_string($alias) ? $alias : null));
6074
}
6175
}

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\SentStamp;
@@ -138,4 +140,24 @@ public function testItSkipsReceivedMessages()
138140

139141
$this->assertNull($envelope->last(SentStamp::class), 'it does not add sent stamp for received messages');
140142
}
143+
144+
public function testItDispatchesTheEventOnceTime()
145+
{
146+
$envelope = new Envelope(new DummyMessage('original envelope'));
147+
148+
$dispatcher = $this->createMock(EventDispatcherInterface::class);
149+
$dispatcher->expects($this->once())
150+
->method('dispatch')
151+
->with(new SendMessageToTransportsEvent($envelope));
152+
153+
$sender1 = $this->getMockBuilder(SenderInterface::class)->getMock();
154+
$sender2 = $this->getMockBuilder(SenderInterface::class)->getMock();
155+
156+
$middleware = new SendMessageMiddleware(new SendersLocator([DummyMessage::class => [$sender1, $sender2]]), $dispatcher);
157+
158+
$sender1->expects($this->once())->method('send')->willReturn($envelope);
159+
$sender2->expects($this->once())->method('send')->willReturn($envelope);
160+
161+
$middleware->handle($envelope, $this->getStackMock(false));
162+
}
141163
}

src/Symfony/Component/Messenger/composer.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
"require-dev": {
2323
"symfony/console": "~3.4|~4.0",
2424
"symfony/dependency-injection": "~3.4.19|^4.1.8",
25+
"symfony/event-dispatcher": "~4.3",
2526
"symfony/http-kernel": "~3.4|~4.0",
2627
"symfony/process": "~3.4|~4.0",
2728
"symfony/property-access": "~3.4|~4.0",
@@ -30,6 +31,9 @@
3031
"symfony/validator": "~3.4|~4.0",
3132
"symfony/var-dumper": "~3.4|~4.0"
3233
},
34+
"conflict": {
35+
"symfony/event-dispatcher": "<4.3"
36+
},
3337
"suggest": {
3438
"enqueue/messenger-adapter": "For using the php-enqueue library as a transport."
3539
},

0 commit comments

Comments
 (0)