Skip to content
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

[Messenger] make senders/handlers locator accept envelopes #29052

Merged
merged 1 commit into from Nov 1, 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.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
5 changes: 0 additions & 5 deletions src/Symfony/Component/Messenger/Envelope.php
Expand Up @@ -74,9 +74,4 @@ public function getMessage()
{
return $this->message;
}

public function getMessageName(): string
{
return \get_class($this->message);
}
}
12 changes: 6 additions & 6 deletions src/Symfony/Component/Messenger/Handler/HandlersLocator.php
Expand Up @@ -11,6 +11,8 @@

namespace Symfony\Component\Messenger\Handler;

use Symfony\Component\Messenger\Envelope;

/**
* Maps a message to a list of handlers.
*
Expand All @@ -33,11 +35,11 @@ public function __construct(array $handlers)
/**
* {@inheritdoc}
*/
public function getHandlers(string $name): iterable
public function getHandlers(Envelope $envelope): iterable
{
$seen = array();

foreach (self::listTypes($name) as $type) {
foreach (self::listTypes($envelope) as $type) {
foreach ($this->handlers[$type] ?? array() as $handler) {
if (!\in_array($handler, $seen, true)) {
yield $seen[] = $handler;
Expand All @@ -49,11 +51,9 @@ public function getHandlers(string $name): iterable
/**
* @internal
*/
public static function listTypes(string $class): array
public static function listTypes(Envelope $envelope): array
{
if (!class_exists($class, false)) {
return array($class => $class, '*' => '*');
}
$class = \get_class($envelope->getMessage());

return array($class => $class)
+ class_parents($class)
Expand Down
Expand Up @@ -11,6 +11,8 @@

namespace Symfony\Component\Messenger\Handler;

use Symfony\Component\Messenger\Envelope;

/**
* Maps a message to a list of handlers.
*
Expand All @@ -25,5 +27,5 @@ interface HandlersLocatorInterface
*
* @return iterable|callable[]
*/
public function getHandlers(string $name): iterable;
public function getHandlers(Envelope $envelope): iterable;
}
Expand Up @@ -40,12 +40,11 @@ public function handle(Envelope $envelope, StackInterface $stack): Envelope
{
$handler = null;
$message = $envelope->getMessage();
$name = $envelope->getMessageName();
foreach ($this->handlersLocator->getHandlers($name) as $handler) {
foreach ($this->handlersLocator->getHandlers($envelope) as $handler) {
$handler($message);
}
if (null === $handler && !$this->allowNoHandlers) {
throw new NoHandlerForMessageException(sprintf('No handler for message "%s".', $name));
throw new NoHandlerForMessageException(sprintf('No handler for message "%s".', \get_class($envelope->getMessage())));
}

return $stack->next()->handle($envelope, $stack);
Expand Down
Expand Up @@ -36,20 +36,20 @@ public function handle(Envelope $envelope, StackInterface $stack): Envelope
$message = $envelope->getMessage();
$context = array(
'message' => $message,
'name' => $envelope->getMessageName(),
'class' => \get_class($envelope->getMessage()),
);
$this->logger->debug('Starting handling message "{name}"', $context);
$this->logger->debug('Starting handling message "{class}"', $context);

try {
$envelope = $stack->next()->handle($envelope, $stack);
} catch (\Throwable $e) {
$context['exception'] = $e;
$this->logger->warning('An exception occurred while handling message "{name}"', $context);
$this->logger->warning('An exception occurred while handling message "{class}"', $context);

throw $e;
}

$this->logger->debug('Finished handling message "{name}"', $context);
$this->logger->debug('Finished handling message "{class}"', $context);

return $envelope;
}
Expand Down
Expand Up @@ -42,7 +42,7 @@ public function handle(Envelope $envelope, StackInterface $stack): Envelope
$handle = false;
$sender = null;

foreach ($this->sendersLocator->getSenders($envelope->getMessageName(), $handle) as $sender) {
foreach ($this->sendersLocator->getSenders($envelope, $handle) as $sender) {
$envelope = $sender->send($envelope);
}

Expand Down
Expand Up @@ -32,7 +32,7 @@
$worker = new Worker($receiver, new class() implements MessageBusInterface {
public function dispatch($envelope): Envelope
{
echo 'Get envelope with message: '.$envelope->getMessageName()."\n";
echo 'Get envelope with message: '.\get_class($envelope->getMessage())."\n";
echo sprintf("with stamps: %s\n", json_encode(array_keys($envelope->all()), JSON_PRETTY_PRINT));

sleep(30);
Expand Down
Expand Up @@ -12,11 +12,11 @@
namespace Symfony\Component\Messenger\Tests\Transport\Sender;

use PHPUnit\Framework\TestCase;
use Symfony\Component\Messenger\Exception\RuntimeException;
use Symfony\Component\Messenger\Envelope;
use Symfony\Component\Messenger\Tests\Fixtures\DummyMessage;
use Symfony\Component\Messenger\Tests\Fixtures\SecondMessage;
use Symfony\Component\Messenger\Transport\Sender\SendersLocator;
use Symfony\Component\Messenger\Transport\Sender\SenderInterface;
use Symfony\Component\Messenger\Transport\Sender\SendersLocator;

class SendersLocatorTest extends TestCase
{
Expand All @@ -27,7 +27,7 @@ public function testItReturnsTheSenderBasedOnTheMessageClass()
DummyMessage::class => array($sender),
));

$this->assertSame(array($sender), iterator_to_array($locator->getSenders(DummyMessage::class)));
$this->assertSame(array(), iterator_to_array($locator->getSenders(SecondMessage::class)));
$this->assertSame(array($sender), iterator_to_array($locator->getSenders(new Envelope(new DummyMessage('a')))));
$this->assertSame(array(), iterator_to_array($locator->getSenders(new Envelope(new SecondMessage('b')))));
}
}
Expand Up @@ -11,9 +11,8 @@

namespace Symfony\Component\Messenger\Transport\Sender;

use Symfony\Component\Messenger\Exception\RuntimeException;
use Symfony\Component\Messenger\Envelope;
use Symfony\Component\Messenger\Handler\HandlersLocator;
use Symfony\Component\Messenger\Transport\Sender\SenderInterface;

/**
* Maps a message to a list of senders.
Expand All @@ -40,13 +39,13 @@ public function __construct(array $senders, array $sendAndHandle = array())
/**
* {@inheritdoc}
*/
public function getSenders(string $name, ?bool &$handle = false): iterable
public function getSenders(Envelope $envelope, ?bool &$handle = false): iterable
{
$handle = false;
$sender = null;
$seen = array();

foreach (HandlersLocator::listTypes($name) as $type) {
foreach (HandlersLocator::listTypes($envelope) as $type) {
foreach ($this->senders[$type] ?? array() as $sender) {
if (!\in_array($sender, $seen, true)) {
yield $seen[] = $sender;
Expand Down
Expand Up @@ -11,7 +11,7 @@

namespace Symfony\Component\Messenger\Transport\Sender;

use Symfony\Component\Messenger\Transport\Sender\SenderInterface;
use Symfony\Component\Messenger\Envelope;

/**
* Maps a message to a list of senders.
Expand All @@ -31,5 +31,5 @@ interface SendersLocatorInterface
*
* @return iterable|SenderInterface[]
*/
public function getSenders(string $name, ?bool &$handle = false): iterable;
public function getSenders(Envelope $envelope, ?bool &$handle = false): iterable;
}