[Messenger] added interfaces to be type-hinted even when not using a Container

This commit is contained in:
Fabien Potencier 2018-09-07 18:43:08 +02:00
parent 373dad371a
commit 963fde9fb1
3 changed files with 60 additions and 46 deletions

View File

@ -0,0 +1,55 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Messenger\Handler\Locator;
use Symfony\Component\Messenger\Exception\NoHandlerForMessageException;
/**
* @author Miha Vrhovnik <miha.vrhovnik@gmail.com>
* @author Samuel Roze <samuel.roze@gmail.com>
*/
abstract class AbstractHandlerLocator implements HandlerLocatorInterface
{
public function resolve($message): callable
{
$messageClass = \get_class($message);
if (null === $handler = $this->resolveFromClass($messageClass)) {
throw new NoHandlerForMessageException(sprintf('No handler for message "%s".', $messageClass));
}
return $handler;
}
private function resolveFromClass(string $class): ?callable
{
if ($handler = $this->getHandler($class)) {
return $handler;
}
foreach (class_implements($class, false) as $interface) {
if ($handler = $this->getHandler($interface)) {
return $handler;
}
}
foreach (class_parents($class, false) as $parent) {
if ($handler = $this->getHandler($parent)) {
return $handler;
}
}
return null;
}
abstract protected function getHandler(string $class);
}

View File

@ -12,13 +12,12 @@
namespace Symfony\Component\Messenger\Handler\Locator;
use Psr\Container\ContainerInterface;
use Symfony\Component\Messenger\Exception\NoHandlerForMessageException;
/**
* @author Miha Vrhovnik <miha.vrhovnik@gmail.com>
* @author Samuel Roze <samuel.roze@gmail.com>
*/
class ContainerHandlerLocator implements HandlerLocatorInterface
class ContainerHandlerLocator extends AbstractHandlerLocator
{
private $container;
@ -27,39 +26,7 @@ class ContainerHandlerLocator implements HandlerLocatorInterface
$this->container = $container;
}
public function resolve($message): callable
{
$messageClass = \get_class($message);
if (null === $handler = $this->resolveFromClass($messageClass)) {
throw new NoHandlerForMessageException(sprintf('No handler for message "%s".', $messageClass));
}
return $handler;
}
private function resolveFromClass($class): ?callable
{
if ($handler = $this->getHandler($class)) {
return $handler;
}
foreach (class_implements($class, false) as $interface) {
if ($handler = $this->getHandler($interface)) {
return $handler;
}
}
foreach (class_parents($class, false) as $parent) {
if ($handler = $this->getHandler($parent)) {
return $handler;
}
}
return null;
}
private function getHandler($class)
protected function getHandler(string $class)
{
$handlerKey = 'handler.'.$class;

View File

@ -11,12 +11,10 @@
namespace Symfony\Component\Messenger\Handler\Locator;
use Symfony\Component\Messenger\Exception\NoHandlerForMessageException;
/**
* @author Samuel Roze <samuel.roze@gmail.com>
*/
class HandlerLocator implements HandlerLocatorInterface
class HandlerLocator extends AbstractHandlerLocator
{
/**
* Maps a message (its class) to a given handler.
@ -28,14 +26,8 @@ class HandlerLocator implements HandlerLocatorInterface
$this->messageToHandlerMapping = $messageToHandlerMapping;
}
public function resolve($message): callable
protected function getHandler(string $class)
{
$messageKey = \get_class($message);
if (!isset($this->messageToHandlerMapping[$messageKey])) {
throw new NoHandlerForMessageException(sprintf('No handler for message "%s".', $messageKey));
}
return $this->messageToHandlerMapping[$messageKey];
return $this->messageToHandlerMapping[$class] ?? null;
}
}