8000 [Messenger] Envelope as first class citizen in middleware too · symfony/symfony@a2d7960 · GitHub
[go: up one dir, main page]

Skip to content

Commit a2d7960

Browse files
committed
[Messenger] Envelope as first class citizen in middleware too
1 parent 7497ad4 commit a2d7960

17 files changed

+89
-161
lines changed

src/Symfony/Bridge/Doctrine/Messenger/DoctrineTransactionMiddleware.php

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

1414
use Doctrine\Common\Persistence\ManagerRegistry;
1515
use Doctrine\ORM\EntityManagerInterface;
16+
use Symfony\Component\Messenger\Envelope;
1617
use Symfony\Component\Messenger\Middleware\MiddlewareInterface;
1718

1819
/**
@@ -31,7 +32,7 @@ public function __construct(ManagerRegistry $managerRegistry, ?string $entityMan
3132
$this->entityManagerName = $entityManagerName;
3233
}
3334

34-
public function handle($message, callable $next)
35+
public function handle(Envelope $envelope, callable $next)
3536
{
3637
$entityManager = $this->managerRegistry->getManager($this->entityManagerName);
3738

@@ -41,7 +42,7 @@ public function handle($message, callable $next)
4142

4243
$entityManager->getConnection()->beginTransaction();
4344
try {
44-
$result = $next($message);
45+
$result = $next($envelope);
4546
$entityManager->flush();
4647
$entityManager->getConnection()->commit();
4748
} catch (\Throwable $exception) {

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

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,13 @@
1515
use Symfony\Component\Messenger\Asynchronous\Routing\SenderLocatorInterface;
1616
use Symfony\Component\Messenger\Asynchronous\Transport\ReceivedMessage;
1717
use Symfony\Component\Messenger\Envelope;
18-
use Symfony\Component\Messenger\EnvelopeAwareInterface;
1918
use Symfony\Component\Messenger\Middleware\MiddlewareInterface;
2019

2120
/**
2221
* @author Samuel Roze <samuel.roze@gmail.com>
2322
* @author Tobias Schultze <http://tobion.de>
2423
*/
25-
class SendMessageMiddleware implements MiddlewareInterface, EnvelopeAwareInterface
24+
class SendMessageMiddleware implements MiddlewareInterface
2625
{
2726
private $senderLocator;
2827
private $messagesToSendAndHandleMapping;
@@ -36,12 +35,11 @@ public function __construct(SenderLocatorInterface $senderLocator, array $messag
3635
/**
3736
* {@inheritdoc}
3837
*/
39-
public function handle($message, callable $next)
38+
public function handle(Envelope $envelope, callable $next)
4039
{
41-
$envelope = Envelope::wrap($message);
4240
if ($envelope->get(ReceivedMessage::class)) {
4341
// It's a received message. Do not send it back:
44-
return $next($message);
42+
return $next($envelope);
4543
}
4644

4745
$sender = $this->senderLocator->getSenderForMessage($envelope->getMessage());
@@ -54,7 +52,7 @@ public function handle($message, callable $next)
5452
}
5553
}
5654

57-
return $next($message);
55+
return $next($envelope);
5856
}
5957

6058
private function mustSendAndHandle($message): bool

src/Symfony/Component/Messenger/EnvelopeAwareInterface.php

Lines changed: 0 additions & 23 deletions
This file was deleted.

src/Symfony/Component/Messenger/MessageBus.php

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,10 @@ public function dispatch($message)
4444
throw new InvalidArgumentException(sprintf('Invalid type for message argument. Expected object, but got "%s".', \gettype($message)));
4545
}
4646

47-
return \call_user_func($this->callableForNextMiddleware(0, Envelope::wrap($message)), $message);
47+
return \call_user_func($this->callableForNextMiddleware(0), Envelope::wrap($message));
4848
}
4949

50-
private function callableForNextMiddleware(int $index, Envelope $currentEnvelope): callable
50+
private function callableForNextMiddleware(int $index): callable
5151
{
5252
if (null === $this->indexedMiddlewareHandlers) {
5353
$this->indexedMiddlewareHandlers = \is_array($this->middlewareHandlers) ? array_values($this->middlewareHandlers) : iterator_to_array($this->middlewareHandlers, false);
@@ -59,19 +59,8 @@ private function callableForNextMiddleware(int $index, Envelope $currentEnvelope
5959

6060
$middleware = $this->indexedMiddlewareHandlers[$index];
6161

62-
return function ($message) use ($middleware, $index, $currentEnvelope) {
63-
if ($message instanceof Envelope) {
64-
$currentEnvelope = $message;
65-
} else {
66-
$message = $currentEnvelope->withMessage($message);
67-
}
68-
69-
if (!$middleware instanceof EnvelopeAwareInterface) {
70-
// Do not provide the envelope if the middleware cannot read it:
71-
$message = $message->getMessage();
72-
}
73-
74-
return $middleware->handle($message, $this->callableForNextMiddleware($index + 1, $currentEnvelope));
62+
return function (Envelope $envelope) use ($middleware, $index) {
63+
return $middleware->handle($envelope, $this->callableForNextMiddleware($index + 1));
7564
};
7665
}
7766
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,18 @@
1111

1212
namespace Symfony\Component\Messenger\Middleware;
1313

14+
use Symfony\Component\Messenger\Envelope;
1415
use Symfony\Component\Messenger\Exception\NoHandlerForMessageException;
1516

1617
/**
1718
* @author Samuel Roze <samuel.roze@gmail.com>
1819
*/
1920
class AllowNoHandlerMiddleware implements MiddlewareInterface
2021
{
21-
public function handle($message, callable $next)
22+
public function handle(Envelope $envelope, callable $next)
2223
{
2324
try {
24-
return $next($message);
25+
return $next($envelope);
2526
} catch (NoHandlerForMessageException $e) {
2627
// We allow not having a handler for this message.
2728
}

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

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

1212
namespace Symfony\Component\Messenger\Middleware;
1313

14+
use Symfony\Component\Messenger\Envelope;
1415
use Symfony\Component\Messenger\Handler\Locator\HandlerLocatorInterface;
1516

1617
/**
@@ -28,12 +29,13 @@ public function __construct(HandlerLocatorInterface $messageHandlerResolver)
2829
/**
2930
* {@inheritdoc}
3031
*/
31-
public function handle($message, callable $next)
32+
public function handle(Envelope $envelope, callable $next)
3233
{
34+
$message = $envelope->getMessage();
3335
$handler = $this->messageHandlerResolver->resolve($message);
3436
$result = $handler($message);
3537

36-
$next($message);
38+
$next($envelope);
3739

3840
return $result;
3941
}

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
namespace Symfony\Component\Messenger\Middleware;
1313

1414
use Psr\Log\LoggerInterface;
15+
use Symfony\Component\Messenger\Envelope;
1516

1617
/**
1718
* @author Samuel Roze <samuel.roze@gmail.com>
@@ -28,12 +29,14 @@ public function __construct(LoggerInterface $logger)
2829
/**
2930
* {@inheritdoc}
3031
*/
31-
public function handle($message, callable $next)
32+
public function handle(Envelope $envelope, callable $next)
3233
{
34+
$message = $envelope->getMessage();
35+
3336
$this->logger->debug('Starting handling message {class}', $this->createContext($message));
3437

3538
try {
36-
$result = $next($message);
39+
$result = $next($envelope);
3740
} catch (\Throwable $e) {
3841
$this->logger->warning('An exception occurred while handling message {class}', array_merge(
3942
$this->createContext($message),

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

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

1212
namespace Symfony\Component\Messenger\Middleware;
1313

14+
use Symfony\Component\Messenger\Envelope;
15+
1416
/**
1517
* @author Samuel Roze <samuel.roze@gmail.com>
1618
*
@@ -19,9 +21,9 @@
1921
interface MiddlewareInterface
2022
{
2123
/**
22-
* @param object $message
24+
* @param Envelope $envelope
2325
*
2426
* @return mixed
2527
*/
26-
public function handle($message, callable $next);
28+
public function handle(Envelope $envelope, callable $next);
2729
}

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

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,14 @@
1212
namespace Symfony\Component\Messenger\Middleware;
1313

1414
use Symfony\Component\Messenger\Envelope;
15-
use Symfony\Component\Messenger\EnvelopeAwareInterface;
1615
use Symfony\Component\Messenger\Exception\ValidationFailedException;
1716
use Symfony\Component\Messenger\Middleware\Configuration\ValidationConfiguration;
1817
use Symfony\Component\Validator\Validator\ValidatorInterface;
1918

2019
/**
2120
* @author Tobias Nyholm <tobias.nyholm@gmail.com>
2221
*/
23-
class ValidationMiddleware implements MiddlewareInterface, EnvelopeAwareInterface
22+
class ValidationMiddleware implements MiddlewareInterface
2423
{
2524
private $validator;
2625

@@ -29,21 +28,20 @@ public function __construct(ValidatorInterface $validator)
2928
$this->validator = $validator;
3029
}
3130

32-
public function handle($message, callable $next)
31+
public function handle(Envelope $envelope, callable $next)
3332
{
34-
$envelope = Envelope::wrap($message);
35-
$subject = $envelope->getMessage();
33+
$message = $envelope->getMessage();
3634
$groups = null;
3735
/** @var ValidationConfiguration|null $validationConfig */
3836
if ($validationConfig = $envelope->get(ValidationConfiguration::class)) {
3937
$groups = $validationConfig->getGroups();
4038
}
4139

42-
$violations = $this->validator->validate($subject, null, $groups);
40+
$violations = $this->validator->validate($message, null, $groups);
4341
if (\count($violations)) {
44-
throw new ValidationFailedException($subject, $violations);
42+
throw new ValidationFailedException($message, $violations);
4543
}
4644

47-
return $next($message);
45+
return $next($envelope);
4846
}
4947
}

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

Lines changed: 16 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -24,20 +24,6 @@
2424
class SendMessageMiddlewareTest extends TestCase
2525
{
2626
public function testItSendsTheMessageToAssignedSender()
27-
{
28-
$message = new DummyMessage('Hey');
29-
$sender = $this->getMockBuilder(SenderInterface::class)->getMock();
30-
$next = $this->createPartialMock(\stdClass::class, array('__invoke'));
31-
32-
$middleware = new SendMessageMiddleware(new InMemorySenderLocator($sender));
33-
34-
$sender->expects($this->once())->method('send')->with(Envelope::wrap($message));
35-
$next->expects($this->never())->method($this->anything());
36-
37-
$middleware->handle($message, $next);
38-
}
39-
40-
public function testItSendsTheMessageToAssignedSenderWithPreWrappedMessage()
4127
{
4228
$envelope = Envelope::wrap(new DummyMessage('Hey'));
4329
$sender = $this->getMockBuilder(SenderInterface::class)->getMock();
@@ -53,78 +39,78 @@ public function testItSendsTheMessageToAssignedSenderWithPreWrappedMessage()
5339

5440
public function testItAlsoCallsTheNextMiddlewareBasedOnTheMessageClass()
5541
{
56-
$message = new DummyMessage('Hey');
42+
$envelope = Envelope::wrap(new DummyMessage('Hey'));
5743
$sender = $this->getMockBuilder(SenderInterface::class)->getMock();
5844
$next = $this->createPartialMock(\stdClass::class, array('__invoke'));
5945

6046
$middleware = new SendMessageMiddleware(new InMemorySenderLocator($sender), array(
6147
DummyMessage::class => true,
6248
));
6349

64-
$sender->expects($this->once())->method('send')->with(Envelope::wrap($message));
50+
$sender->expects($this->once())->method('send')->with($envelope);
6551
$next->expects($this->once())->method($this->anything());
6652

67-
$middleware->handle($message, $next);
53+
$middleware->handle($envelope, $next);
6854
}
6955

7056
public function testItAlsoCallsTheNextMiddlewareBasedOnTheMessageParentClass()
7157
{
72-
$message = new ChildDummyMessage('Hey');
58+
$envelope = Envelope::wrap(new ChildDummyMessage('Hey'));
7359
$sender = $this->getMockBuilder(SenderInterface::class)->getMock();
7460
$next = $this->createPartialMock(\stdClass::class, array('__invoke'));
7561

7662
$middleware = new SendMessageMiddleware(new InMemorySenderLocator($sender), array(
7763
DummyMessage::class => true,
7864
));
7965

80-
$sender->expects($this->once())->method('send')->with(Envelope::wrap($message));
66+
$sender->expects($this->once())->method('send')->with($envelope);
8167
$next->expects($this->once())->method($this->anything());
8268

83-
$middleware->handle($message, $next);
69+
$middleware->handle($envelope, $next);
8470
}
8571

8672
public function testItAlsoCallsTheNextMiddlewareBasedOnTheMessageInterface()
8773
{
88-
$message = new DummyMessage('Hey');
74+
$envelope = Envelope::wrap(new DummyMessage('Hey'));
8975
$sender = $this->getMockBuilder(SenderInterface::class)->getMock();
9076
$next = $this->createPartialMock(\stdClass::class, array('__invoke'));
9177

9278
$middleware = new SendMessageMiddleware(new InMemorySenderLocator($sender), array(
9379
DummyMessageInterface::class => true,
9480
));
9581

96-
$sender->expects($this->once())->method('send')->with(Envelope::wrap($message));
82+
$sender->expects($this->once())->method('send')->with($envelope);
9783
$next->expects($this->once())->method($this->anything());
9884

99-
$middleware->handle($message, $next);
85+
$middleware->handle($envelope, $next);
10086
}
10187

10288
public function testItAlsoCallsTheNextMiddlewareBasedOnWildcard()
10389
{
104-
$message = new DummyMessage('Hey');
90+
$envelope = Envelope::wrap(new DummyMessage('Hey'));
10591
$sender = $this->getMockBuilder(SenderInterface::class)->getMock();
10692
$next = $this->createPartialMock(\stdClass::class, array('__invoke'));
10793

10894
$middleware = new SendMessageMiddleware(new InMemorySenderLocator($sender), array(
10995
'*' => true,
11096
));
11197

112-
$sender->expects($this->once())->method('send')->with(Envelope::wrap($message));
113-
$next->expects($this->once())->method($this->anything());
98+
$sender->expects($this->once())->method('send')->with($envelope);
99+
$next->expects($this->once())->method($this->anything())->with($envelope);
114100

115-
$middleware->handle($message, $next);
101+
$middleware->handle($envelope, $next);
116102
}
117103

118104
public function testItCallsTheNextMiddlewareWhenNoSenderForThisMessage()
119105
{
120-
$message = new DummyMessage('Hey');
106+
$envelope = Envelope::wrap(new DummyMessage('Hey'));
121107
$next = $this->createPartialMock(\stdClass::class, array('__invoke'));
122108

123109
$middleware = new SendMessageMiddleware(new InMemorySenderLocator(null));
124110

125-
$next->expects($this->once())->method($this->anything());
111+
$next->expects($this->once())->method($this->anything())->with($envelope);
126112

127-
$middleware->handle($message, $next);
113+
$middleware->handle($envelope, $next);
128114
}
129115

130116
public function testItSkipsReceivedMessages()

src/Symfony/Component/Messenger/Tests/DependencyInjection/MessengerPassTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -687,8 +687,8 @@ public function __invoke()
687687

688688
class UselessMiddleware implements MiddlewareInterface
689689
{
690-
public function handle($message, callable $next)
690+
public function handle(Envelope $envelope, callable $next)
691691
{
692-
return $next($message);
692+
return $next($envelope);
693693
}
694694
}

0 commit comments

Comments
 (0)
0