From e4a6a062cba8f2c07fb86019cdebc0b70e7acdae Mon Sep 17 00:00:00 2001 From: Samuel ROZE Date: Wed, 25 Apr 2018 20:07:50 +0200 Subject: [PATCH 1/3] WIP --- .../FrameworkBundle/DependencyInjection/Configuration.php | 1 + .../DependencyInjection/FrameworkExtension.php | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php index be57575299e8d..31528f67c7979 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php @@ -1054,6 +1054,7 @@ function ($a) { ->addDefaultsIfNotSet() ->children() ->booleanNode('default_middlewares')->defaultTrue()->end() + ->scalarNode('class')->end() ->arrayNode('middlewares') ->defaultValue(array()) ->prototype('scalar')->end() diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index 99fe0de88f71f..322012e830a85 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -1482,7 +1482,11 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder } $container->setParameter($busId.'.middlewares', $middlewares); - $container->setDefinition($busId, (new Definition(MessageBus::class, array(array())))->addTag('messenger.bus', array('name' => $name))); + $container->setDefinition($busId, (new Definition($bus['class'] ?? MessageBus::class, array(array())))->addTag('messenger.bus', array('name' => $name))); + + if (isset($bus['class'])) { + $container->setAlias($bus['class'], $busId); + } if ($name === $config['default_bus']) { $container->setAlias('message_bus', $busId); From 78c15c19fba3513ac94d727c885daff59fec90d0 Mon Sep 17 00:00:00 2001 From: Samuel ROZE Date: Wed, 25 Apr 2018 22:01:33 +0200 Subject: [PATCH 2/3] Configure the class used to decorate your bus --- .../DependencyInjection/Configuration.php | 2 +- .../FrameworkExtension.php | 11 +++--- .../Messenger/DecoratedMessageBus.php | 38 +++++++++++++++++++ .../DependencyInjection/MessengerPass.php | 6 +++ .../DependencyInjection/MessengerPassTest.php | 16 ++++++++ 5 files changed, 67 insertions(+), 6 deletions(-) create mode 100644 src/Symfony/Component/Messenger/DecoratedMessageBus.php diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php index 31528f67c7979..e36253e660ddc 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php @@ -1054,7 +1054,7 @@ function ($a) { ->addDefaultsIfNotSet() ->children() ->booleanNode('default_middlewares')->defaultTrue()->end() - ->scalarNode('class')->end() + ->scalarNode('decorator_class')->end() ->arrayNode('middlewares') ->defaultValue(array()) ->prototype('scalar')->end() diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index 322012e830a85..d259083d748a2 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -1481,13 +1481,14 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder throw new LogicException('The Validation middleware is only available when the Validator component is installed and enabled. Try running "composer require symfony/validator".'); } - $container->setParameter($busId.'.middlewares', $middlewares); - $container->setDefinition($busId, (new Definition($bus['class'] ?? MessageBus::class, array(array())))->addTag('messenger.bus', array('name' => $name))); - - if (isset($bus['class'])) { - $container->setAlias($bus['class'], $busId); + $tagAttributes = array('name' => $name); + if (isset($bus['decorator_class'])) { + $tagAttributes['decorator_class'] = $bus['decorator_class']; } + $container->setParameter($busId.'.middlewares', $middlewares); + $container->setDefinition($busId, (new Definition(MessageBus::class, array(array())))->addTag('messenger.bus', $tagAttributes)); + if ($name === $config['default_bus']) { $container->setAlias('message_bus', $busId); $container->setAlias(MessageBusInterface::class, $busId); diff --git a/src/Symfony/Component/Messenger/DecoratedMessageBus.php b/src/Symfony/Component/Messenger/DecoratedMessageBus.php new file mode 100644 index 0000000000000..b93428a3c5434 --- /dev/null +++ b/src/Symfony/Component/Messenger/DecoratedMessageBus.php @@ -0,0 +1,38 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Messenger; + +/** + * A decorated message bus. + * + * Use this abstract class to created your message bus decorator to specialise your + * bus instances and type-hint them. + * + * @author Samuel Roze + */ +abstract class DecoratedMessageBus implements MessageBusInterface +{ + private $decoratedBus; + + public function __construct(MessageBusInterface $decoratedBus) + { + $this->decoratedBus = $decoratedBus; + } + + /** + * {@inheritdoc} + */ + public function dispatch($message) + { + return $this->decoratedBus->dispatch($message); + } +} diff --git a/src/Symfony/Component/Messenger/DependencyInjection/MessengerPass.php b/src/Symfony/Component/Messenger/DependencyInjection/MessengerPass.php index 1fd76db8fee25..ec9860f04ee30 100644 --- a/src/Symfony/Component/Messenger/DependencyInjection/MessengerPass.php +++ b/src/Symfony/Component/Messenger/DependencyInjection/MessengerPass.php @@ -63,6 +63,12 @@ public function process(ContainerBuilder $container) if ($container->hasDefinition('messenger.data_collector')) { $this->registerBusToCollector($container, $busId, $tags[0]); } + + if (isset($tags[0]['decorator_class'])) { + $container->register($tags[0]['decorator_class'], $tags[0]['decorator_class']) + ->setDecoratedService($busId) + ->setArguments(array(new Reference($tags[0]['decorator_class'].'.inner'))); + } } $this->registerReceivers($container); diff --git a/src/Symfony/Component/Messenger/Tests/DependencyInjection/MessengerPassTest.php b/src/Symfony/Component/Messenger/Tests/DependencyInjection/MessengerPassTest.php index bc52e1f671afe..af108c938b3c8 100644 --- a/src/Symfony/Component/Messenger/Tests/DependencyInjection/MessengerPassTest.php +++ b/src/Symfony/Component/Messenger/Tests/DependencyInjection/MessengerPassTest.php @@ -20,6 +20,7 @@ use Symfony\Component\Messenger\Adapter\AmqpExt\AmqpSender; use Symfony\Component\Messenger\ContainerHandlerLocator; use Symfony\Component\Messenger\DataCollector\MessengerDataCollector; +use Symfony\Component\Messenger\DecoratedMessageBus; use Symfony\Component\Messenger\DependencyInjection\MessengerPass; use Symfony\Component\Messenger\Handler\ChainHandler; use Symfony\Component\Messenger\Handler\MessageSubscriberInterface; @@ -260,6 +261,17 @@ public function testRegistersTraceableBusesToCollector() $this->assertEquals(array(array('registerBus', array('foo', new Reference($debuggedFooBusId))), array('registerBus', array('messenger.bus.bar', new Reference($debuggedBarBusId)))), $container->getDefinition('messenger.data_collector')->getMethodCalls()); } + public function testRegistersBusDecoratedClass() + { + $container = $this->getContainerBuilder(); + $container->register($fooBusId = 'messenger.bus.foo', MessageBusInterface::class)->addTag('messenger.bus', array('decorator_class' => MyTypeHintedBus::class)); + + (new MessengerPass())->process($container); + + $this->assertTrue($container->hasDefinition(MyTypeHintedBus::class)); + $this->assertSame(array($fooBusId, null, 0), $container->getDefinition(MyTypeHintedBus::class)->getDecoratedService()); + } + public function testRegistersMiddlewaresFromServices() { $container = $this->getContainerBuilder(); @@ -413,3 +425,7 @@ public function handle($message, callable $next) return $next($message); } } + +final class MyTypeHintedBus extends DecoratedMessageBus +{ +} From 2b601ad411cf7db4cdd39a5efd279aafe5426c47 Mon Sep 17 00:00:00 2001 From: Samuel ROZE Date: Fri, 27 Apr 2018 10:58:46 +0200 Subject: [PATCH 3/3] Remove the FWB configuration and rename the abstract decorator --- .../DependencyInjection/Configuration.php | 1 - .../FrameworkExtension.php | 7 +--- ...us.php => AbstractMessageBusDecorator.php} | 6 ++-- .../DependencyInjection/MessengerPass.php | 6 ---- .../Tests/AbstractMessageBusDecoratorTest.php | 34 +++++++++++++++++++ .../DependencyInjection/MessengerPassTest.php | 16 --------- 6 files changed, 38 insertions(+), 32 deletions(-) rename src/Symfony/Component/Messenger/{DecoratedMessageBus.php => AbstractMessageBusDecorator.php} (76%) create mode 100644 src/Symfony/Component/Messenger/Tests/AbstractMessageBusDecoratorTest.php diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php index e36253e660ddc..be57575299e8d 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php @@ -1054,7 +1054,6 @@ function ($a) { ->addDefaultsIfNotSet() ->children() ->booleanNode('default_middlewares')->defaultTrue()->end() - ->scalarNode('decorator_class')->end() ->arrayNode('middlewares') ->defaultValue(array()) ->prototype('scalar')->end() diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index d259083d748a2..99fe0de88f71f 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -1481,13 +1481,8 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder throw new LogicException('The Validation middleware is only available when the Validator component is installed and enabled. Try running "composer require symfony/validator".'); } - $tagAttributes = array('name' => $name); - if (isset($bus['decorator_class'])) { - $tagAttributes['decorator_class'] = $bus['decorator_class']; - } - $container->setParameter($busId.'.middlewares', $middlewares); - $container->setDefinition($busId, (new Definition(MessageBus::class, array(array())))->addTag('messenger.bus', $tagAttributes)); + $container->setDefinition($busId, (new Definition(MessageBus::class, array(array())))->addTag('messenger.bus', array('name' => $name))); if ($name === $config['default_bus']) { $container->setAlias('message_bus', $busId); diff --git a/src/Symfony/Component/Messenger/DecoratedMessageBus.php b/src/Symfony/Component/Messenger/AbstractMessageBusDecorator.php similarity index 76% rename from src/Symfony/Component/Messenger/DecoratedMessageBus.php rename to src/Symfony/Component/Messenger/AbstractMessageBusDecorator.php index b93428a3c5434..30149cb0ad787 100644 --- a/src/Symfony/Component/Messenger/DecoratedMessageBus.php +++ b/src/Symfony/Component/Messenger/AbstractMessageBusDecorator.php @@ -14,12 +14,12 @@ /** * A decorated message bus. * - * Use this abstract class to created your message bus decorator to specialise your - * bus instances and type-hint them. + * Use this abstract class to create your message bus decorator to specialise your + * bus instances and type-hint against them. * * @author Samuel Roze */ -abstract class DecoratedMessageBus implements MessageBusInterface +abstract class AbstractMessageBusDecorator implements MessageBusInterface { private $decoratedBus; diff --git a/src/Symfony/Component/Messenger/DependencyInjection/MessengerPass.php b/src/Symfony/Component/Messenger/DependencyInjection/MessengerPass.php index ec9860f04ee30..1fd76db8fee25 100644 --- a/src/Symfony/Component/Messenger/DependencyInjection/MessengerPass.php +++ b/src/Symfony/Component/Messenger/DependencyInjection/MessengerPass.php @@ -63,12 +63,6 @@ public function process(ContainerBuilder $container) if ($container->hasDefinition('messenger.data_collector')) { $this->registerBusToCollector($container, $busId, $tags[0]); } - - if (isset($tags[0]['decorator_class'])) { - $container->register($tags[0]['decorator_class'], $tags[0]['decorator_class']) - ->setDecoratedService($busId) - ->setArguments(array(new Reference($tags[0]['decorator_class'].'.inner'))); - } } $this->registerReceivers($container); diff --git a/src/Symfony/Component/Messenger/Tests/AbstractMessageBusDecoratorTest.php b/src/Symfony/Component/Messenger/Tests/AbstractMessageBusDecoratorTest.php new file mode 100644 index 0000000000000..17711366d6429 --- /dev/null +++ b/src/Symfony/Component/Messenger/Tests/AbstractMessageBusDecoratorTest.php @@ -0,0 +1,34 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Messenger\Tests; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\Messenger\AbstractMessageBusDecorator; +use Symfony\Component\Messenger\MessageBusInterface; +use Symfony\Component\Messenger\Tests\Fixtures\DummyMessage; + +class AbstractMessageBusDecoratorTest extends TestCase +{ + public function testItCanBeExtendedAndProxiesTheMessagesToTheBus() + { + $message = new DummyMessage('Foo'); + + $bus = $this->getMockBuilder(MessageBusInterface::class)->getMock(); + $bus->expects($this->once())->method('dispatch')->with($message)->willReturn('bar'); + + $this->assertSame('bar', (new CommandBus($bus))->dispatch($message)); + } +} + +class CommandBus extends AbstractMessageBusDecorator +{ +} diff --git a/src/Symfony/Component/Messenger/Tests/DependencyInjection/MessengerPassTest.php b/src/Symfony/Component/Messenger/Tests/DependencyInjection/MessengerPassTest.php index af108c938b3c8..bc52e1f671afe 100644 --- a/src/Symfony/Component/Messenger/Tests/DependencyInjection/MessengerPassTest.php +++ b/src/Symfony/Component/Messenger/Tests/DependencyInjection/MessengerPassTest.php @@ -20,7 +20,6 @@ use Symfony\Component\Messenger\Adapter\AmqpExt\AmqpSender; use Symfony\Component\Messenger\ContainerHandlerLocator; use Symfony\Component\Messenger\DataCollector\MessengerDataCollector; -use Symfony\Component\Messenger\DecoratedMessageBus; use Symfony\Component\Messenger\DependencyInjection\MessengerPass; use Symfony\Component\Messenger\Handler\ChainHandler; use Symfony\Component\Messenger\Handler\MessageSubscriberInterface; @@ -261,17 +260,6 @@ public function testRegistersTraceableBusesToCollector() $this->assertEquals(array(array('registerBus', array('foo', new Reference($debuggedFooBusId))), array('registerBus', array('messenger.bus.bar', new Reference($debuggedBarBusId)))), $container->getDefinition('messenger.data_collector')->getMethodCalls()); } - public function testRegistersBusDecoratedClass() - { - $container = $this->getContainerBuilder(); - $container->register($fooBusId = 'messenger.bus.foo', MessageBusInterface::class)->addTag('messenger.bus', array('decorator_class' => MyTypeHintedBus::class)); - - (new MessengerPass())->process($container); - - $this->assertTrue($container->hasDefinition(MyTypeHintedBus::class)); - $this->assertSame(array($fooBusId, null, 0), $container->getDefinition(MyTypeHintedBus::class)->getDecoratedService()); - } - public function testRegistersMiddlewaresFromServices() { $container = $this->getContainerBuilder(); @@ -425,7 +413,3 @@ public function handle($message, callable $next) return $next($message); } } - -final class MyTypeHintedBus extends DecoratedMessageBus -{ -}