Skip to content

Commit 8b65e28

Browse files
[Messenger] remove AllowNoHandlerMiddleware in favor of a constructor argument on HandleMessageMiddleware
1 parent 8cde55e commit 8b65e28

File tree

9 files changed

+37
-113
lines changed

9 files changed

+37
-113
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ CHANGELOG
3030
* `SenderLocatorInterface::getSenderForMessage()` has been replaced by `getSender(Envelope $envelope)`
3131
* `MessengerDataCollector::getMessages()` returns an iterable, not just an array anymore
3232
* `AbstractHandlerLocator` is now internal
33-
* `HandlerLocatorInterface::resolve()` has been replaced by `getHandler(Envelope $envelope)`
33+
* `HandlerLocatorInterface::resolve()` has been replaced by `getHandler(Envelope $envelope): ?callable` and shouldn't throw when no handlers are found
3434
* `SenderLocatorInterface::getSenderForMessage()` has been replaced by `getSender(Envelope $envelope)`
3535
* `SenderInterface::send()` returns `void`
3636
* Classes in the `Middleware\Enhancers` sub-namespace have been moved to the `Middleware` one
@@ -39,6 +39,7 @@ CHANGELOG
3939
* `SenderInterface` and `ChainSender` classes have been moved to the `Transport\Sender` sub-namespace
4040
* `ReceiverInterface` and its implementations have been moved to the `Transport\Receiver` sub-namespace
4141
* `ActivationMiddlewareDecorator` has been renamed `ActivationMiddleware`
42+
* `AllowNoHandlerMiddleware` has been removed in favor of a new constructor argument on `HandleMessageMiddleware`
4243

4344
4.1.0
4445
-----

Handler/Locator/AbstractHandlerLocator.php

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

1414
use Symfony\Component\Messenger\Envelope;
15-
use Symfony\Component\Messenger\Exception\NoHandlerForMessageException;
1615

1716
/**
1817
* @author Miha Vrhovnik <[email protected]>
@@ -22,7 +21,7 @@
2221
*/
2322
abstract class AbstractHandlerLocator implements HandlerLocatorInterface
2423
{
25-
public function getHandler(Envelope $envelope): callable
24+
public function getHandler(Envelope $envelope): ?callable
2625
{
2726
$class = \get_class($envelope->getMessage());
2827

@@ -42,7 +41,7 @@ public function getHandler(Envelope $envelope): callable
4241
}
4342
}
4443

45-
throw new NoHandlerForMessageException(sprintf('No handler for message "%s".', $class));
44+
return null;
4645
}
4746

4847
abstract protected function getHandlerByName(string $name): ?callable;

Handler/Locator/HandlerLocatorInterface.php

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
namespace Symfony\Component\Messenger\Handler\Locator;
1313

1414
use Symfony\Component\Messenger\Envelope;
15-
use Symfony\Component\Messenger\Exception\NoHandlerForMessageException;
1615

1716
/**
1817
* @author Samuel Roze <[email protected]>
@@ -21,8 +20,6 @@ interface HandlerLocatorInterface
2120
{
2221
/**
2322
* Returns the handler for the given message.
24-
*
25-
* @throws NoHandlerForMessageException When no handler is found
2623
*/
27-
public function getHandler(Envelope $envelope): callable;
24+
public function getHandler(Envelope $envelope): ?callable;
2825
}

Middleware/AllowNoHandlerMiddleware.php

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

Middleware/HandleMessageMiddleware.php

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

1414
use Symfony\Component\Messenger\Envelope;
15+
use Symfony\Component\Messenger\Exception\NoHandlerForMessageException;
1516
use Symfony\Component\Messenger\Handler\Locator\HandlerLocatorInterface;
1617

1718
/**
@@ -20,19 +21,26 @@
2021
class HandleMessageMiddleware implements MiddlewareInterface
2122
{
2223
private $messageHandlerLocator;
24+
private $allowNoHandlers;
2325

24-
public function __construct(HandlerLocatorInterface $messageHandlerLocator)
26+
public function __construct(HandlerLocatorInterface $messageHandlerLocator, bool $allowNoHandlers = false)
2527
{
2628
$this->messageHandlerLocator = $messageHandlerLocator;
29+
$this->allowNoHandlers = $allowNoHandlers;
2730
}
2831

2932
/**
3033
* {@inheritdoc}
34+
*
35+
* @throws NoHandlerForMessageException When no handler is found and $allowNoHandlers is false
3136
*/
3237
public function handle(Envelope $envelope, callable $next): void
3338
{
34-
$handler = $this->messageHandlerLocator->getHandler($envelope);
35-
$handler($envelope->getMessage());
36-
$next($envelope);
39+
if (null !== $handler = $this->messageHandlerLocator->getHandler($envelope)) {
40+
$handler($envelope->getMessage());
41+
$next($envelope);
42+
} elseif (!$this->allowNoHandlers) {
43+
throw new NoHandlerForMessageException(sprintf('No handler for message "%s".', \get_class($envelope->getMessage())));
44+
}
3745
}
3846
}

Tests/DependencyInjection/MessengerPassTest.php

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
2828
use Symfony\Component\Messenger\Handler\MessageSubscriberInterface;
2929
use Symfony\Component\Messenger\MessageBusInterface;
30-
use Symfony\Component\Messenger\Middleware\AllowNoHandlerMiddleware;
3130
use Symfony\Component\Messenger\Middleware\HandleMessageMiddleware;
3231
use Symfony\Component\Messenger\Middleware\MiddlewareInterface;
3332
use Symfony\Component\Messenger\Tests\Fixtures\DummyCommand;
@@ -493,7 +492,6 @@ public function testRegistersTraceableBusesToCollector()
493492
public function testRegistersMiddlewareFromServices()
494493
{
495494
$container = $this->getContainerBuilder($fooBusId = 'messenger.bus.foo');
496-
$container->register('messenger.middleware.allow_no_handler', AllowNoHandlerMiddleware::class)->setAbstract(true);
497495
$container->register('middleware_with_factory', UselessMiddleware::class)->addArgument('some_default')->setAbstract(true);
498496
$container->register('middleware_with_factory_using_default', UselessMiddleware::class)->addArgument('some_default')->setAbstract(true);
499497
$container->register(UselessMiddleware::class, UselessMiddleware::class);
@@ -502,14 +500,11 @@ public function testRegistersMiddlewareFromServices()
502500
array('id' => UselessMiddleware::class),
503501
array('id' => 'middleware_with_factory', 'arguments' => array('foo', 'bar')),
504502
array('id' => 'middleware_with_factory_using_default'),
505-
array('id' => 'allow_no_handler'),
506503
));
507504

508505
(new MessengerPass())->process($container);
509506
(new ResolveChildDefinitionsPass())->process($container);
510507

511-
$this->assertTrue($container->hasDefinition($childMiddlewareId = $fooBusId.'.middleware.allow_no_handler'));
512-
513508
$this->assertTrue($container->hasDefinition($factoryChildMiddlewareId = $fooBusId.'.middleware.middleware_with_factory'));
514509
$this->assertEquals(
515510
array('foo', 'bar'),
@@ -528,7 +523,6 @@ public function testRegistersMiddlewareFromServices()
528523
new Reference(UselessMiddleware::class),
529524
new Reference($factoryChildMiddlewareId),
530525
new Reference($factoryWithDefaultChildMiddlewareId),
531-
new Reference($childMiddlewareId),
532526
), $container->getDefinition($fooBusId)->getArgument(0));
533527
$this->assertFalse($container->hasParameter($middlewareParameter));
534528
}

Tests/Handler/Locator/ContainerHandlerLocatorTest.php

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,10 @@ public function testItLocatesHandlerUsingTheMessageClass()
2525
$this->assertSame($handler, $resolvedHandler);
2626
}
2727

28-
/**
29-
* @expectedException \Symfony\Component\Messenger\Exception\NoHandlerForMessageException
30-
* @expectedExceptionMessage No handler for message "Symfony\Component\Messenger\Tests\Fixtures\DummyMessage"
31-
*/
32-
public function testThrowsNoHandlerException()
28+
public function testNoHandlersReturnsNull()
3329
{
3430
$locator = new ContainerHandlerLocator(new Container());
35-
$locator->getHandler(new Envelope(new DummyMessage('Hey')));
31+
$this->assertNull($locator->getHandler(new Envelope(new DummyMessage('Hey'))));
3632
}
3733

3834
public function testGetHandlerViaInterface()

Tests/Middleware/AllowNoHandlerMiddlewareTest.php

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

Tests/Middleware/HandleMessageMiddlewareTest.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,22 @@ public function testItCallsTheHandlerAndNextMiddleware()
3737

3838
$middleware->handle($envelope, $next);
3939
}
40+
41+
/**
42+
* @expectedException \Symfony\Component\Messenger\Exception\NoHandlerForMessageException
43+
* @expectedExceptionMessage No handler for message "Symfony\Component\Messenger\Tests\Fixtures\DummyMessage"
44+
*/
45+
public function testThrowsNoHandlerException()
46+
{
47+
$middleware = new HandleMessageMiddleware(new HandlerLocator(array()));
48+
49+
$middleware->handle(new Envelope(new DummyMessage('Hey')), function () {});
50+
}
51+
52+
public function testAllowNoHandlers()
53+
{
54+
$middleware = new HandleMessageMiddleware(new HandlerLocator(array()), true);
55+
56+
$this->assertNull($middleware->handle(new Envelope(new DummyMessage('Hey')), function () {}));
57+
}
4058
}

0 commit comments

Comments
 (0)