8000 Allow interfaces to be type-hinted as well · symfony/symfony@a2f6bd9 · GitHub
[go: up one dir, main page]

Skip to content

Commit a2f6bd9

Browse files
committed
Allow interfaces to be type-hinted as well
1 parent ff1727e commit a2f6bd9

File tree

3 files changed

+67
-4
lines changed

3 files changed

+67
-4
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ private function registerHandlers(ContainerBuilder $container, array $busIds)
114114
$method = $method[0];
115115
}
116116

117-
if (!\class_exists($messageClass)) {
117+
if (!\class_exists($messageClass) && !\interface_exists($messageClass)) {
118118
$messageClassLocation = isset($tag['handles']) ? 'declared in your tag attribute "handles"' : $r->implementsInterface(MessageSubscriberInterface::class) ? sprintf('returned by method "%s::getHandledMessages()"', $r->getName()) : sprintf('used as argument type in method "%s::%s()"', $r->getName(), $method);
119119

120120
throw new RuntimeException(sprintf('Invalid handler service "%s": message class "%s" %s does not exist.', $serviceId, $messageClass, $messageClassLocation));

src/Symfony/Component/Messenger/Handler/Locator/ContainerHandlerLocator.php

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,27 @@ public function __construct(ContainerInterface $container)
3030
public function resolve($message): callable
3131
{
3232
$messageClass = \get_class($message);
33-
$handlerKey = 'handler.'.$messageClass;
3433

35-
if (!$this->container->has($handlerKey)) {
34+
if (null === $handler = $this->resolveFromClass($messageClass)) {
3635
throw new NoHandlerForMessageException(sprintf('No handler for message "%s".', $messageClass));
3736
}
3837

39-
return $this->container->get($handlerKey);
38+
return $handler;
39+
}
40+
41+
private function resolveFromClass($class) : ?callable
42+
{
43+
$handlerKey = 'handler.'.$class;
44+
if ($this->container->has($handlerKey)) {
45+
return $this->container->get($handlerKey);
46+
}
47+
48+
foreach (class_implements($class, false) as $interface) {
49+
if ($handler = $this->resolveFromClass($interface)) {
50+
return $handler;
51+
}
52+
}
53+
54+
return null;
4055
}
4156
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<?php
2+
3+
namespace Symfony\Component\Messenger\Tests\Handler\Locator;
4+
5+
use PHPUnit\Framework\TestCase;
6+
use Symfony\Component\DependencyInjection\Container;
7+
use Symfony\Component\Messenger\Handler\Locator\ContainerHandlerLocator;
8+
use Symfony\Component\Messenger\Tests\Fixtures\DummyMessage;
9+
use Symfony\Component\Messenger\Tests\Fixtures\DummyMessageInterface;
10+
11+
class ContainerHandlerLocatorTest extends TestCase
12+
{
13+
public function testItLocatesHandlerUsingTheMessageClass()
14+
{
15+
$handler = function() {};
16+
17+
$container = new Container();
18+
$container->set('handler.'.DummyMessage::class, $handler);
19+
20+
$locator = new ContainerHandlerLocator($container);
21+
$resolvedHandler = $locator->resolve(new DummyMessage('Hey'));
22+
23+
$this->assertSame($handler, $resolvedHandler);
24+
}
25+
26+
/**
27+
* @expectedException \Symfony\Component\Messenger\Exception\NoHandlerForMessageException
28+
* @expectedExceptionMessage No handler for message "Symfony\Component\Messenger\Tests\Fixtures\DummyMessage"
29+
*/
30+
public function testThrowsNoHandlerException()
31+
{
32+
$locator = new ContainerHandlerLocator(new Container());
33+
$locator->resolve(new DummyMessage('Hey'));
34+
}
35+
36+
public function testResolveMessageViaTheirInterface()
37+
{
38+
$handler = function() {};
39+
40+
$container = new Container();
41+
$container->set('handler.'.DummyMessageInterface::class, $handler);
42+
43+
$locator = new ContainerHandlerLocator($container);
44+
$resolvedHandler = $locator->resolve(new DummyMessage('Hey'));
45+
46+
$this->assertSame($handler, $resolvedHandler);
47+
}
48+
}

0 commit comments

Comments
 (0)
0