Skip to content

Commit 62b4115

Browse files
committed
Remove the messenger.bus_middleware and only uses the YAML configuration
1 parent e1fb489 commit 62b4115

File tree

14 files changed

+152
-121
lines changed

14 files changed

+152
-121
lines changed

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

+3-1
Original file line numberDiff line numberDiff line change
@@ -1041,12 +1041,14 @@ function ($a) {
10411041
->end()
10421042
->scalarNode('default_bus')->defaultValue('default')->end()
10431043
->arrayNode('buses')
1044-
->defaultValue(array('default' => array('middlewares' => array())))
1044+
->defaultValue(array('default' => array('middlewares' => $defaultMiddlewares = array(array('service' => 'logging'), array('service' => 'route_messages'), array('service' => 'call_message_handler')))))
10451045
->useAttributeAsKey('name')
10461046
->prototype('array')
10471047
->fixXmlConfig('middleware')
1048+
->addDefaultsIfNotSet()
10481049
->children()
10491050
->arrayNode('middlewares')
1051+
->defaultValue($defaultMiddlewares)
10501052
->prototype('array')
10511053
->beforeNormalization()
10521054
->ifString()

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

+19-11
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
use Symfony\Component\Lock\LockInterface;
6161
use Symfony\Component\Lock\Store\StoreFactory;
6262
use Symfony\Component\Lock\StoreInterface;
63+
use Symfony\Component\Messenger\DataCollector\BusCollector;
6364
use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
6465
use Symfony\Component\Messenger\MessageBus;
6566
use Symfony\Component\Messenger\MessageBusInterface;
@@ -1447,26 +1448,33 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
14471448

14481449
$loader->load('messenger.xml');
14491450

1450-
$container->setParameter('messenger.buses_names', array_keys($config['buses']));
1451+
$builtBuses = [];
14511452
foreach ($config['buses'] as $name => $bus) {
1452-
$container->setDefinition($busId = 'messenger.bus.'.$name, (new Definition(MessageBus::class, array(array())))->addTag('messenger.bus')->setPublic(true));
1453+
$middlewares = array_map(function (array $middleware) use ($container) {
1454+
if ($container->has($messengerMiddlewareId = 'messenger.middleware.'.$middleware['service'])) {
1455+
$middleware['service'] = $messengerMiddlewareId;
1456+
}
1457+
1458+
return new Reference($middleware['service']);
1459+
}, $bus['middlewares']);
14531460

1454-
if ($name == $config['default_bus']) {
1461+
$container->setDefinition($busId = 'messenger.bus.'.$name, (new Definition(MessageBus::class, array($middlewares)))->addTag('messenger.bus')->setPublic(true));
1462+
1463+
if ($name === $config['default_bus']) {
14551464
$container->setAlias('message_bus', $busId);
14561465
$container->setAlias(MessageBusInterface::class, $busId);
14571466
}
14581467

1459-
foreach ($bus['middlewares'] as $middleware) {
1460-
if (!$container->has($middleware['service'])) {
1461-
$container->setDefinition($middleware['service'], new Definition($middleware['service']));
1462-
}
1468+
$container->setDefinition(
1469+
$busId.'.debug',
1470+
(new Definition(BusCollector::class, array(new Reference($busId.'.debug.inner'), new Reference('messenger.data_collector'))))->setDecoratedService($busId)
1471+
);
14631472

1464-
$container->getDefinition($middleware['service'])->addTag('messenger.bus_middleware', array(
1465-
'bus' => $name,
1466-
));
1467-
}
1473+
$builtBuses[$name] = $busId;
14681474
}
14691475

1476+
$container->setParameter('messenger.buses', $builtBuses);
1477+
14701478
$senderLocatorMapping = array();
14711479
$messageToSenderIdsMapping = array();
14721480
foreach ($config['routing'] as $message => $messageConfiguration) {

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

+3-11
Original file line numberDiff line numberDiff line change
@@ -14,25 +14,19 @@
1414

1515
<service id="messenger.middleware.call_message_handler" class="Symfony\Component\Messenger\Middleware\HandleMessageMiddleware">
1616
<argument type="service" id="messenger.handler_resolver" />
17-
18-
<tag name="messenger.bus_middleware" priority="-10" />
1917
</service>
2018

2119
<service id="messenger.middleware.validator" class="Symfony\Component\Messenger\Middleware\ValidationMiddleware">
2220
<argument type="service" id="validator" />
23-
24-
<tag name="messenger.bus_middleware" priority="100" />
2521
</service>
2622

2723
<!-- Asynchronous -->
2824
<service id="messenger.asynchronous.routing.sender_locator" class="Symfony\Component\Messenger\Asynchronous\Routing\SenderLocator">
2925
<argument type="service" id="messenger.sender_locator" />
3026
<argument /> <!-- Message to sender ID mapping -->
3127
</service>
32-
<service id="messenger.asynchronous.middleware.send_message_to_producer" class="Symfony\Component\Messenger\Asynchronous\Middleware\SendMessageMiddleware">
28+
<service id="messenger.middleware.route_messages" class="Symfony\Component\Messenger\Asynchronous\Middleware\SendMessageMiddleware">
3329
<argument type="service" id="messenger.asynchronous.routing.sender_locator" />
34-
35-
<tag name="messenger.bus_middleware" priority="-5" />
3630
</service>
3731

3832
<!-- Message encoding/decoding -->
@@ -44,16 +38,14 @@
4438
<service id="messenger.transport.default_decoder" alias="messenger.transport.serialize_message_with_type_in_headers" public="true" />
4539

4640
<!-- Logging & Debug -->
47-
<service id="messenger.middleware.debug.logging" class="Symfony\Component\Messenger\Debug\LoggingMiddleware">
41+
<service id="messenger.middleware.logging" class="Symfony\Component\Messenger\Middleware\LoggingMiddleware">
4842
<argument type="service" id="logger" />
4943

50-
<tag name="messenger.bus_middleware" priority="10" />
5144
<tag name="monolog.logger" channel="messenger" />
5245
</service>
5346

54-
<service id="data_collector.messenger" class="Symfony\Component\Messenger\DataCollector\MessengerDataCollector">
47+
<service id="messenger.data_collector" class="Symfony\Component\Messenger\DataCollector\MessengerDataCollector">
5548
<tag name="data_collector" template="@WebProfiler/Collector/messenger.html.twig" id="messenger" priority="100" />
56-
<tag name="messenger.bus_middleware" />
5749
</service>
5850

5951
<!-- Discovery -->

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/messenger_multiple_buses.php

+2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
'commands' => null,
88
'events' => array(
99
'middlewares' => array(
10+
'route_messages',
1011
'Symfony\\Component\\Messenger\\Middleware\\TolerateNoHandler',
12+
'call_message_handler'
1113
),
1214
),
1315
),

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/messenger_multiple_buses.xml

+2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99
<framework:messenger default-bus="commands">
1010
<framework:bus name="commands" />
1111
<framework:bus name="events">
12+
<framework:middleware service="route_messages" />
1213
<framework:middleware service="Symfony\Component\Messenger\Middleware\TolerateNoHandler" />
14+
<framework:middleware service="call_message_handler" />
1315
</framework:bus>
1416
</framework:messenger>
1517
</framework:config>

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/messenger_multiple_buses.yml

+2
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,6 @@ framework:
55
commands: ~
66
events:
77
middlewares:
8+
- "route_messages"
89
- "Symfony\\Component\\Messenger\\Middleware\\TolerateNoHandler"
10+
- "call_message_handler"

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

+3-9
Original file line numberDiff line numberDiff line change
@@ -524,8 +524,7 @@ public function testWebLink()
524524
public function testMessenger()
525525
{
526526
$container = $this->createContainerFromFile('messenger');
527-
$this->assertTrue($container->hasDefinition('message_bus'));
528-
$this->assertFalse($container->hasDefinition('messenger.middleware.doctrine_transaction'));
527+
$this->assertTrue($container->has('message_bus'));
529528
}
530529

531530
public function testMessengerValidationEnabled()
@@ -572,17 +571,12 @@ public function testMessengerWithMultipleBuses()
572571
$container = $this->createContainerFromFile('messenger_multiple_buses');
573572

574573
$this->assertTrue($container->has('messenger.bus.commands'));
575-
$this->assertEquals(array(), $container->getDefinition('messenger.bus.commands')->getArgument(0));
574+
$this->assertEquals(array(new Reference('messenger.middleware.logging'), new Reference('messenger.middleware.route_messages'), new Reference('messenger.middleware.call_message_handler')), $container->getDefinition('messenger.bus.commands')->getArgument(0));
576575
$this->assertTrue($container->has('messenger.bus.events'));
577-
$this->assertEquals(array(), $container->getDefinition('messenger.bus.events')->getArgument(0));
578-
579-
$this->assertTrue($container->has(TolerateNoHandler::class));
580-
$this->assertTrue($container->getDefinition(TolerateNoHandler::class)->hasTag('messenger.bus_middleware'));
576+
$this->assertEquals(array(new Reference('messenger.middleware.route_messages'), new Reference(TolerateNoHandler::class), new Reference('messenger.middleware.call_message_handler')), $container->getDefinition('messenger.bus.events')->getArgument(0));
581577

582578
$this->assertTrue($container->hasAlias('message_bus'));
583579
$this->assertEquals('messenger.bus.commands', (string) $container->getAlias('message_bus'));
584-
585-
$this->assertEquals(array('commands', 'events'), $container->getParameter('messenger.buses_names'));
586580
}
587581

588582
public function testTranslator()
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\DataCollector;
13+
14+
use Symfony\Component\Messenger\MessageBusInterface;
15+
16+
/**
17+
* @author Samuel Roze <samuel.roze@gmail.com>
18+
*/
19+
class BusCollector implements MessageBusInterface
20+
{
21+
private $decoratedBus;
22+
private $collector;
23+
24+
public function __construct(MessageBusInterface $decoratedBus, MessengerDataCollector $collector)
25+
{
26+
$this->decoratedBus = $decoratedBus;
27+
$this->collector = $collector;
28+
}
29+
30+
public function dispatch($message)
31+
{
32+
try {
33+
$result = $this->decoratedBus->dispatch($message);
34+
35+
$this->collector->collectMessage($message, $result);
36+
37+
return $result;
38+
} catch (\Throwable $exception) {
39+
$this->collector->collectMessage($message, null, $exception);
40+
41+
throw $exception;
42+
}
43+
}
44+
}

src/Symfony/Component/Messenger/DataCollector/MessengerDataCollector.php

+8-14
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
*
2222
* @experimental in 4.1
2323
*/
24-
class MessengerDataCollector extends DataCollector implements MiddlewareInterface
24+
class MessengerDataCollector extends DataCollector
2525
{
2626
/**
2727
* {@inheritdoc}
@@ -48,9 +48,10 @@ public function reset()
4848
}
4949

5050
/**
51-
* {@inheritdoc}
51+
* Collect the given message.
52+
*
5253
*/
53-
public function handle($message, callable $next)
54+
public function collectMessage($message, $result = null, \Throwable $exception = null)
5455
{
5556
$debugRepresentation = array(
5657
'message' => array(
@@ -59,10 +60,7 @@ public function handle($message, callable $next)
5960
),
6061
);
6162

62-
$exception = null;
63-
try {
64-
$result = $next($message);
65-
63+
if (null !== $result) {
6664
if (\is_object($result)) {
6765
$debugRepresentation['result'] = array(
6866
'type' => \get_class($result),
@@ -79,20 +77,16 @@ public function handle($message, callable $next)
7977
'value' => $result,
8078
);
8179
}
82-
} catch (\Throwable $exception) {
80+
}
81+
82+
if ($exception !== null) {
8383
$debugRepresentation['exception'] = array(
8484
'type' => \get_class($exception),
8585
'message' => $exception->getMessage(),
8686
);
8787
}
8888

8989
$this->data['messages'][] = $debugRepresentation;
90-
91-
if (null !== $exception) {
92-
throw $exception;
93-
}
94-
95-
return $result;
9690
}
9791

9892
public function getMessages(): array

src/Symfony/Component/Messenger/DependencyInjection/MessengerPass.php

+6-32
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,11 @@ public function process(ContainerBuilder $container)
4747
return;
4848
}
4949

50+
$buses = $container->getParameter('messenger.buses');
5051
if (!$container->getParameter('kernel.debug') || !$container->has('logger')) {
51-
$container->removeDefinition('messenger.middleware.debug.logging');
52+
foreach ($buses as $name => $busId) {
53+
$container->removeDefinition($busId.'.debug');
54+
}
5255
}
5356

5457
if (!$container->has('serializer')) {
@@ -59,7 +62,8 @@ public function process(ContainerBuilder $container)
5962

6063
$this->registerReceivers($container);
6164
$this->registerHandlers($container);
62-
$this->registerMiddlewares($container);
65+
66+
$container->getParameterBag()->remove('messenger.buses');
6367
}
6468

6569
private function registerHandlers(ContainerBuilder $container)
@@ -161,34 +165,4 @@ private function registerReceivers(ContainerBuilder $container)
161165

162166
$container->getDefinition('messenger.receiver_locator')->replaceArgument(0, $receiverMapping);
163167
}
164-
165-
private function registerMiddlewares(ContainerBuilder $container)
166-
{
167-
if (!$container->hasParameter('messenger.buses_names')) {
168-
return;
169-
}
170-
171-
$busesNames = $container->getParameter('messenger.buses_names');
172-
$middlewaresPerBuses = array();
173-
174-
foreach ($container->findTaggedServiceIds('messenger.bus_middleware') as $serviceId => $tags) {
175-
foreach ($tags as $tag) {
176-
$priority = $tag['priority'] ?? 0;
177-
$buses = isset($tag['bus']) ? explode(',', $tag['bus']) : $busesNames;
178-
179-
foreach ($buses as $bus) {
180-
$middlewaresPerBuses[$bus][$priority][] = new Reference($serviceId);
181-
}
182-
}
183-
}
184-
185-
foreach ($middlewaresPerBuses as $bus => $middlewares) {
186-
krsort($middlewaresPerBuses[$bus]);
187-
$middlewaresPerBuses[$bus] = call_user_func_array('array_merge', $middlewaresPerBuses[$bus]);
188-
}
189-
190-
foreach ($middlewaresPerBuses as $name => $middlewares) {
191-
$container->getDefinition('messenger.bus.'.$name)->replaceArgument(0, $middlewares);
192-
}
193-
}
194168
}

src/Symfony/Component/Messenger/Debug/LoggingMiddleware.php renamed to src/Symfony/Component/Messenger/Middleware/LoggingMiddleware.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
* file that was distributed with this source code.
1010
*/
1111

12-
namespace Symfony\Component\Messenger\Debug;
12+
namespace Symfony\Component\Messenger\Middleware;
1313

1414
use Symfony\Component\Messenger\MiddlewareInterface;
1515
use Psr\Log\LoggerInterface;
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\DataCollector;
13+
14+
use PHPUnit\Framework\TestCase;
15+
use Symfony\Component\Messenger\DataCollector\BusCollector;
16+
use Symfony\Component\Messenger\DataCollector\MessengerDataCollector;
17+
use Symfony\Component\Messenger\MessageBusInterface;
18+
use Symfony\Component\Messenger\Tests\Fixtures\DummyMessage;
19+
20+
/**
21+
* @author Samuel Roze <samuel.roze@gmail.com>
22+
*/
23+
class BusCollectorTest extends TestCase
24+
{
25+
public function testCollectsResult()
26+
{
27+
$message = new DummyMessage('foo');
28+
$bus = $this->getMockBuilder(MessageBusInterface::class)->getMock();
29+
$bus->method('dispatch')->with($message)->willReturn($result = array('foo' => 'bar'));
30+
31+
$collector = $this->getMockBuilder(MessengerDataCollector::class)->getMock();
32+
$collector->expects($this->once())->method('collectMessage')->with($message, $result);
33+
34+
$busCollector = new BusCollector($bus, $collector);
35+
$this->assertSame($result, $busCollector->dispatch($message));
36+
}
37+
38+
/**
39+
* @expectedException \RuntimeException
40+
* @expectedExceptionMessage Meh
41+
*/
42+
public function testCollectsException()
43+
{
44+
$message = new DummyMessage('foo');
45+
$bus = $this->getMockBuilder(MessageBusInterface::class)->getMock();
46+
$bus->method('dispatch')->with($message)->willThrowException($exception = new \RuntimeException('Meh'));
47+
48+
$collector = $this->getMockBuilder(MessengerDataCollector::class)->getMock();
49+
$collector->expects($this->once())->method('collectMessage')->with($message, null, $exception);
50+
51+
$busCollector = new BusCollector($bus, $collector);
52+
$busCollector->dispatch($message);
53+
}
54+
}

0 commit comments

Comments
 (0)