8000 [Messenger] remove AllowNoHandlerMiddleware in favor of a constructor argument on HandleMessageMiddleware by nicolas-grekas · Pull Request #28945 · symfony/symfony · GitHub
[go: up one dir, main page]

Skip to content

[Messenger] remove AllowNoHandlerMiddleware in favor of a constructor argument on HandleMessageMiddleware #28945

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Oct 25, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8000
Original file line number Diff line number Diff line change
Expand Up @@ -1081,19 +1081,20 @@ function ($a) {
->arrayNode('buses')
->defaultValue(array('messenger.bus.default' => array('default_middleware' => true, 'middleware' => array())))
->useAttributeAsKey('name')
->prototype('array')
->arrayPrototype()
->addDefaultsIfNotSet()
->children()
->booleanNode('default_middleware')->defaultTrue()->end()
->enumNode('default_middleware')
->values(array(true, false, 'allow_no_handlers'))
->defaultTrue()
->end()
->arrayNode('middleware')
->beforeNormalization()
->ifString()
->then(function (string $middleware) {
return array($middleware);
})
->ifTrue(function ($v) { return \is_string($v) || !\is_int(key($v)); })
->then(function ($v) { return array($v); })
->end()
->defaultValue(array())
->prototype('array')
->arrayPrototype()
->beforeNormalization()
->always()
->then(function ($middleware): array {
Expand All @@ -1103,8 +1104,8 @@ function ($a) {
if (isset($middleware['id'])) {
return $middleware;
}
if (\count($middleware) > 1) {
throw new \InvalidArgumentException(sprintf('There is an error at path "framework.messenger" in one of the buses middleware definitions: expected a single entry for a middleware item config, with factory id as key and arguments as value. Got "%s".', json_encode($middleware)));
if (1 < \count($middleware)) {
throw new \InvalidArgumentException(sprintf('Invalid middleware at path "framework.messenger": a map with a single factory id as key and its arguments as value was expected, %s given.', json_encode($middleware)));
}

return array(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1524,7 +1524,16 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
'after' => array(array('id' => 'route_messages'), array('id' => 'call_message_handler')),
);
foreach ($config['buses'] as $busId => $bus) {
$middleware = $bus['default_middleware'] ? array_merge($defaultMiddleware['before'], $bus['middleware'], $defaultMiddleware['after']) : $bus['middleware'];
$middleware = $bus['middleware'];

if ($bus['default_middleware']) {
if ('allow_no_handlers' === $bus['default_middleware']) {
$defaultMiddleware['after'][1]['arguments'] = array(true);
} else {
unset($defaultMiddleware['after'][1]['arguments']);
}
$middleware = array_merge($defaultMiddleware['before'], $middleware, $defaultMiddleware['after']);
}

foreach ($middleware as $middlewareItem) {
if (!$validationConfig['enabled'] && 'messenger.middleware.validation' === $middlewareItem['id']) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
</service>

<!-- Middleware -->
<service id="messenger.middleware.allow_no_handler" class="Symfony\Component\Messenger\Middleware\AllowNoHandlerMiddleware" abstract="true" />
<service id="messenger.middleware.call_message_handler" class="Symfony\Component\Messenger\Middleware\HandleMessageMiddleware" abstract="true">
<argument /> <!-- Bus handler resolver -->
</service>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -331,6 +331,16 @@
</xsd:sequence>
</xsd:complexType>

<xsd:simpleType name="default_middleware">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="true" />
<xsd:enumeration value="false" />
<xsd:enumeration value="1" />
<xsd:enumeration value="0" />
<xsd:enumeration value="allow_no_handlers" />
</xsd:restriction>
</xsd:simpleType>

<xsd:simpleType name="cookie_secure">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="true" />
Expand Down Expand Up @@ -408,7 +418,7 @@
<xsd:element name="middleware" type="messenger_middleware" minOccurs="0" maxOccurs="unbounded" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
<xsd:attribute name="default-middleware" type="xsd:boolean"/>
<xsd:attribute name="default-middleware" type="default_middleware"/>
</xsd:complexType>

<xsd:complexType name="messenger_middleware">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,12 @@
'messenger.bus.events' => array(
'middleware' => array(
array('with_factory' => array('foo', true, array('bar' => 'baz'))),
'allow_no_handler',
),
),
'messenger.bus.queries' => array(
'default_middleware' => false,
'middleware' => array(
'route_messages',
'allow_no_handler',
'call_message_handler',
),
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,9 @@
<framework:bar>baz</framework:bar>
</framework:argument>
</framework:middleware>
<framework:middleware id="allow_no_handler" />
</framework:bus>
<framework:bus name="messenger.bus.queries" default-middleware="false">
<framework:middleware id="route_messages" />
<framework:middleware id="allow_no_handler" />
<framework:middleware id="call_message_handler" />
</framework:bus>
</framework:messenger>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,8 @@ framework:
messenger.bus.events:
middleware:
- with_factory: [foo, true, { bar: baz }]
- "allow_no_handler"
messenger.bus.queries:
default_middleware: false
middleware:
- "route_messages"
- "allow_no_handler"
- "call_message_handler"
Original file line number Diff line number Diff line change
Expand Up @@ -627,15 +627,13 @@ public function testMessengerWithMultipleBuses()
$this->assertEquals(array(
array('id' => 'logging'),
array('id' => 'with_factory', 'arguments' => array('foo', true, array('bar' => 'baz'))),
array('id' => 'allow_no_handler', 'arguments' => array()),
array('id' => 'route_messages'),
array('id' => 'call_message_handler'),
), $container->getParameter('messenger.bus.events.middleware'));
$this->assertTrue($container->has('messenger.bus.queries'));
$this->assertSame(array(), $container->getDefinition('messenger.bus.queries')->getArgument(0));
$this->assertEquals(array(
array('id' => 'route_messages', 'arguments' => array()),
array('id' => 'allow_no_handler', 'arguments' => array()),
array('id' => 'call_message_handler', 'arguments' => array()),
), $container->getParameter('messenger.bus.queries.middleware'));

Expand All @@ -645,7 +643,7 @@ public function testMessengerWithMultipleBuses()

/**
* @expectedException \InvalidArgumentException
* @expectedExceptionMessage There is an error at path "framework.messenger" in one of the buses middleware definitions: expected a single entry for a middleware item config, with factory id as key and arguments as value. Got "{"foo":["qux"],"bar":["baz"]}"
* @expectedExceptionMessage Invalid middleware at path "framework.messenger": a map with a single factory id as key and its arguments as value was expected, {"foo":["qux"],"bar":["baz"]} given.
*/
public function testMessengerMiddlewareFactoryErroneousFormat()
{
Expand Down
10000
3 changes: 2 additions & 1 deletion src/Symfony/Component/Messenger/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ CHANGELOG
* `SenderLocatorInterface::getSenderForMessage()` has been replaced by `getSender(Envelope $envelope)`
* `MessengerDataCollector::getMessages()` returns an iterable, not just an array anymore
* `AbstractHandlerLocator` is now internal
* `HandlerLocatorInterface::resolve()` has been replaced by `getHandler(Envelope $envelope)`
* `HandlerLocatorInterface::resolve()` has been replaced by `getHandler(Envelope $envelope): ?callable` and shouldn't throw when no handlers are found
* `SenderLocatorInterface::getSenderForMessage()` has been replaced by `getSender(Envelope $envelope)`
* `SenderInterface::send()` returns `void`
* Classes in the `Middleware\Enhancers` sub-namespace have been moved to the `Middleware` one
Expand All @@ -39,6 +39,7 @@ CHANGELOG
* `SenderInterface` and `ChainSender` classes have been moved to the `Transport\Sender` sub-namespace
* `ReceiverInterface` and its implementations have been moved to the `Transport\Receiver` sub-namespace
* `ActivationMiddlewareDecorator` has been renamed `ActivationMiddleware`
* `AllowNoHandlerMiddleware` has been removed in favor of a new constructor argument on `HandleMessageMiddleware`

4.1.0
-----
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
namespace Symfony\Component\Messenger\Handler\Locator;

use Symfony\Component\Messenger\Envelope;
use Symfony\Component\Messenger\Exception\NoHandlerForMessageException;

/**
* @author Miha Vrhovnik <miha.vrhovnik@gmail.com>
Expand All @@ -22,7 +21,7 @@
*/
abstract class AbstractHandlerLocator implements HandlerLocatorInterface
{
public function getHandler(Envelope $envelope): callable
public function getHandler(Envelope $envelope): ?callable
{
$class = \get_class($envelope->getMessage());

Expand All @@ -42,7 +41,7 @@ public function getHandler(Envelope $envelope): callable
}
}

throw new NoHandlerForMessageException(sprintf('No handler for message "%s".', $class));
return null;
}

abstract protected function getHandlerByName(string $name): ?callable;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
namespace Symfony\Component\Messenger\Handler\Locator;

use Symfony\Component\Messenger\Envelope;
use Symfony\Component\Messenger\Exception\NoHandlerForMessageException;

/**
* @author Samuel Roze <samuel.roze@gmail.com>
Expand All @@ -21,8 +20,6 @@ interface HandlerLocatorInterface
{
/**
* Returns the handler for the given message.
*
* @throws NoHandlerForMessageException When no handler is found
*/
public function getHandler(Envelope $envelope): callable;
public function getHandler(Envelope $envelope): ?callable;
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
namespace Symfony\Component\Messenger\Middleware;

use Symfony\Component\Messenger\Envelope;
use Symfony\Component\Messenger\Exception\NoHandlerForMessageException;
use Symfony\Component\Messenger\Handler\Locator\HandlerLocatorInterface;

/**
Expand All @@ -20,19 +21,26 @@
class HandleMessageMiddleware implements MiddlewareInterface
{
private $messageHandlerLocator;
private $allowNoHandlers;

public function __construct(HandlerLocatorInterface $messageHandlerLocator)
public function __construct(HandlerLocatorInterface $messageHandlerLocator, bool $allowNoHandlers = false)
{
$this->messageHandlerLocator = $messageHandlerLocator;
$this->allowNoHandlers = $allowNoHandlers;
}

/**
* {@inheritdoc}
*
* @throws NoHandlerForMessageException When no handler is found and $allowNoHandlers is false
*/
public function handle(Envelope $envelope, callable $next): void
{
$handler = $this->messageHandlerLocator->getHandler($envelope);
$handler($envelope->getMessage());
$next($envelope);
if (null !== $handler = $this->messageHandlerLocator->getHandler($envelope)) {
$handler($envelope->getMessage());
$next($envelope);
} elseif (!$this->allowNoHandlers) {
throw new NoHandlerForMessageException(sprintf('No handler for message "%s".', \get_class($envelope->getMessage())));
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

will become $envelope->getDispatchKey() ?? \get_class($envelope->getMessage() right

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Correct, one PR or the other will need a rebase once merged.

}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
use Symfony\Component\Messenger\Handler\MessageSubscriberInterface;
use Symfony\Component\Messenger\MessageBusInterface;
use Symfony\Component\Messenger\Middleware\AllowNoHandlerMiddleware;
use Symfony\Component\Messenger\Middleware\HandleMessageMiddleware;
use Symfony\Component\Messenger\Middleware\MiddlewareInterface;
use Symfony\Component\Messenger\Tests\Fixtures\DummyCommand;
Expand Down Expand Up @@ -493,7 +492,6 @@ public function testRegistersTraceableBusesToCollector()
public function testRegistersMiddlewareFromServices()
{
$container = $this->getContainerBuilder($fooBusId = 'messenger.bus.foo');
$container->register('messenger.middleware.allow_no_handler', AllowNoHandlerMiddleware::class)->setAbstract(true);
$container->register('middleware_with_factory', UselessMiddleware::class)->addArgument('some_default')->setAbstract(true);
$container->register('middleware_with_factory_using_default', UselessMiddleware::class)->addArgument('some_default')->setAbstract(true);
$container->register(UselessMiddleware::class, UselessMiddleware::class);
Expand All @@ -502,14 +500,11 @@ public function testRegistersMiddlewareFromServices()
array('id' => UselessMiddleware::class),
array('id' => 'middleware_with_factory', 'arguments' => array('foo', 'bar')),
array('id' => 'middleware_with_factory_using_default'),
array('id' => 'allow_no_handler'),
));

(new MessengerPass())->process($container);
(new ResolveChildDefinitionsPass())->process($container);

$this->assertTrue($container->hasDefinition($childMiddlewareId = $fooBusId.'.middleware.allow_no_handler'));

$this->assertTrue($container->hasDefinition($factoryChildMiddlewareId = $fooBusId.'.middleware.middleware_with_factory'));
$this->assertEquals(
array('foo', 'bar'),
Expand All @@ -528,7 +523,6 @@ public function testRegistersMiddlewareFromServices()
new Reference(UselessMiddleware::class),
new Reference($factoryChildMiddlewareId),
new Reference($factoryWithDefaultChildMiddlewareId),
new Reference($childMiddlewareId),
), $container->getDefinition($fooBusId)->getArgument(0));
$this->assertFalse($container->hasParameter($middlewareParameter));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,10 @@ public function testItLocatesHandlerUsingTheMessageClass()
$this->assertSame($handler, $resolvedHandler);
}

/**
* @expectedException \Symfony\Component\Messenger\Exception\NoHandlerForMessageException
* @expectedExceptionMessage No handler for message "Symfony\Component\Messenger\Tests\Fixtures\DummyMessage"
*/
public function testThrowsNoHandlerException()
public function testNoHandlersReturnsNull()
{
$locator = new ContainerHandlerLocator(new Container());
$locator->getHandler(new Envelope(new DummyMessage('Hey')));
$this->assertNull($locator->getHandler(new Envelope(new DummyMessage('Hey'))));
}

public function testGetHandlerViaInterface()
Expand Down
Loading
0