Skip to content

Commit feb0c77

Browse files
committed
Adding a middleware to allow you to "hook into" the stamping process
1 parent 522594a commit feb0c77

File tree

5 files changed

+136
-2
lines changed

5 files changed

+136
-2
lines changed

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

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676
use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
7777
use Symfony\Component\Messenger\MessageBus;
7878
use Symfony\Component\Messenger\MessageBusInterface;
79+
use Symfony\Component\Messenger\Middleware\Stamper\EnvelopeStamperInterface;
7980
use Symfony\Component\Messenger\Transport\Serialization\SerializerInterface;
8081
use Symfony\Component\Messenger\Transport\TransportFactoryInterface;
8182
use Symfony\Component\Messenger\Transport\TransportInterface;
@@ -398,6 +399,8 @@ public function load(array $configs, ContainerBuilder $container)
398399
->addTag('messenger.message_handler');
399400
$container->registerForAutoconfiguration(TransportFactoryInterface::class)
400401
->addTag('messenger.transport_factory');
402+
$container->registerForAutoconfiguration(EnvelopeStamperInterface::class)
403+
->addTag('messenger.envelope_stamper');
401404
$container->registerForAutoconfiguration(MimeTypeGuesserInterface::class)
402405
->addTag('mime.mime_type_guesser');
403406
$container->registerForAutoconfiguration(LoggerAwareInterface::class)
@@ -1616,8 +1619,14 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
16161619
}
16171620

16181621
$defaultMiddleware = [
1619-
'before' => [['id' => 'dispatch_after_current_bus']],
1620-
'after' => [['id' => 'send_message'], ['id' => 'handle_message']],
1622+
'before' => [
1623+
['id' => 'envelope_stamper_middleware'],
1624+
['id' => 'dispatch_after_current_bus'],
1625+
],
1626+
'after' => [
1627+
['id' => 'send_message'],
1628+
['id' => 'handle_message'],
1629+
],
16211630
];
16221631
foreach ($config['buses'] as $busId => $bus) {
16231632
$middleware = $bus['middleware'];

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@
4141

4242
<service id="messenger.middleware.dispatch_after_current_bus" class="Symfony\Component\Messenger\Middleware\DispatchAfterCurrentBusMiddleware" />
4343

44+
<service id="messenger.middleware.envelope_stamper_middleware" class="Symfony\Component\Messenger\Middleware\EnvelopeStamperMiddleware">
45+
<argument type="tagged" tag="messenger.envelope_stamper" />
46+
</service>
47+
4448
<service id="messenger.middleware.validation" class="Symfony\Component\Messenger\Middleware\ValidationMiddleware">
4549
<argument type="service" id="validator" />
4650
</service>
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
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\Middleware\Stamper\EnvelopeStamperInterface;
16+
17+
/**
18+
* @author Ryan Weaver <ryan@symfonycasts.com>
19+
*/
20+
class EnvelopeStamperMiddleware implements MiddlewareInterface
21+
{
22+
private $envelopeStampers;
23+
24+
/**
25+
* @param EnvelopeStamperInterface[] $envelopeStampers
26+
*/
27+
public function __construct(iterable $envelopeStampers)
28+
{
29+
$this->envelopeStampers = $envelopeStampers;
30+
}
31+
32+
public function handle(Envelope $envelope, StackInterface $stack): Envelope
33+
{
34+
foreach ($this->envelopeStampers as $envelopeStamper) {
35+
$envelope = $envelopeStamper->stampEnvelope($envelope);
36+
}
37+
38+
return $stack->next()->handle($envelope, $stack);
39+
}
40+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
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\Stamper;
13+
14+
use Symfony\Component\Messenger\Envelope;
15+
16+
/**
17+
* Classes used by EnvelopeStamperMiddleware that can add stamps to envelope.
18+
*
19+
* @author Ryan Weaver <ryan@symfonycasts.com>
20+
*/
21+
interface EnvelopeStamperInterface
22+
{
23+
/**
24+
* Apply new stamps and return the new envelope.
25+
*/
26+
public function stampEnvelope(Envelope $envelope): Envelope;
27+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
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 PHPUnit\Framework\MockObject\MockObject;
15+
use PHPUnit\Framework\TestCase;
16+
use Symfony\Component\Messenger\Envelope;
17+
use Symfony\Component\Messenger\Exception\DelayedMessageHandlingException;
18+
use Symfony\Component\Messenger\MessageBus;
19+
use Symfony\Component\Messenger\MessageBusInterface;
20+
use Symfony\Component\Messenger\Middleware\DispatchAfterCurrentBusMiddleware;
21+
use Symfony\Component\Messenger\Middleware\EnvelopeStamperMiddleware;
22+
use Symfony\Component\Messenger\Middleware\MiddlewareInterface;
23+
use Symfony\Component\Messenger\Middleware\StackInterface;
24+
use Symfony\Component\Messenger\Middleware\Stamper\EnvelopeStamperInterface;
25+
use Symfony\Component\Messenger\Stamp\DispatchAfterCurrentBusStamp;
26+
use Symfony\Component\Messenger\Tests\Fixtures\DummyMessage;
27+
28+
class EnvelopeStamperMiddlewareTest extends TestCase
29+
{
30+
public function testHandleCallsStampers()
31+
{
32+
$stamper1 = $this->createMock(EnvelopeStamperInterface::class);
33+
$stamper2 = $this->createMock(EnvelopeStamperInterface::class);
34+
35+
$envelopeOriginal = new Envelope(new \stdClass());
36+
$envelopeAfterStamper1 = new Envelope(new \stdClass());
37+
$envelopeAfterStamper2 = new Envelope(new \stdClass());
38+
39+
$stamper1->expects($this->once())
40+
->method('stampEnvelope')
41+
->with($envelopeOriginal)
42+
->willReturn($envelopeAfterStamper1);
43+
44+
$stamper2->expects($this->once())
45+
->method('stampEnvelope')
46+
->with($envelopeAfterStamper1)
47+
->willReturn($envelopeAfterStamper2);
48+
49+
$stamperMiddleware = new EnvelopeStamperMiddleware([$stamper1, $stamper2]);
50+
$bus = new MessageBus([$stamperMiddleware]);
51+
$actualFinalEnvelope = $bus->dispatch($envelopeOriginal);
52+
$this->assertSame($envelopeAfterStamper2, $actualFinalEnvelope);
53+
}
54+
}

0 commit comments

Comments
 (0)