Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 9349f3f

Browse filesBrowse files
committed
Allow interfaces to be type-hinted as well
1 parent ff1727e commit 9349f3f
Copy full SHA for 9349f3f

File tree

Expand file treeCollapse file tree

3 files changed

+67
-4
lines changed
Filter options
Expand file treeCollapse file tree

3 files changed

+67
-4
lines changed

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

Copy file name to clipboardExpand all lines: src/Symfony/Component/Messenger/DependencyInjection/MessengerPass.php
+1-1Lines 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

Copy file name to clipboardExpand all lines: src/Symfony/Component/Messenger/Handler/Locator/ContainerHandlerLocator.php
+18-3Lines 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
}
+48Lines 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)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.