Skip to content

Commit

Permalink
SendersLocator: yield sender name or FQCN as key
Browse files Browse the repository at this point in the history
  • Loading branch information
ogizanagi committed Nov 11, 2018
1 parent c78dc7c commit c1308e6
Show file tree
Hide file tree
Showing 6 changed files with 24 additions and 10 deletions.
Expand Up @@ -1578,9 +1578,10 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
if ('*' !== $message && !class_exists($message) && !interface_exists($message, false)) {
throw new LogicException(sprintf('Invalid Messenger routing configuration: class or interface "%s" not found.', $message));
}
$senders = array_map(function ($sender) use ($senderAliases) {
return new Reference($senderAliases[$sender] ?? $sender);
}, $messageConfiguration['senders']);
$senders = array();
foreach ($messageConfiguration['senders'] as $sender) {
$senders[$sender] = new Reference($senderAliases[$sender] ?? $sender);
}

$sendersId = 'messenger.senders.'.$message;
$container->register($sendersId, RewindableGenerator::class)
Expand Down
Expand Up @@ -570,7 +570,10 @@ public function testMessengerRouting()
);

$this->assertSame($messageToSendAndHandleMapping, $senderLocatorDefinition->getArgument(1));
$this->assertEquals(array(new Reference('messenger.transport.amqp'), new Reference('audit')), $container->getDefinition('messenger.senders.'.DummyMessage::class)->getArgument(0)[0]->getValues());
$this->assertEquals(array(
'amqp' => new Reference('messenger.transport.amqp'),
'audit' => new Reference('audit'),
), $container->getDefinition('messenger.senders.'.DummyMessage::class)->getArgument(0)[0]->getValues());
}

/**
Expand Down
Expand Up @@ -43,8 +43,8 @@ public function handle(Envelope $envelope, StackInterface $stack): Envelope
$handle = false;
$sender = null;

foreach ($this->sendersLocator->getSenders($envelope, $handle) as $sender) {
$envelope = $sender->send($envelope)->with(new SentStamp(\get_class($sender)));
foreach ($this->sendersLocator->getSenders($envelope, $handle) as $name => $sender) {
$envelope = $sender->send($envelope)->with(new SentStamp($name));
}

if (null === $sender || $handle) {
Expand Down
Expand Up @@ -27,7 +27,17 @@ public function testItReturnsTheSenderBasedOnTheMessageClass()
DummyMessage::class => array($sender),
));

$this->assertSame(array($sender), iterator_to_array($locator->getSenders(new Envelope(new DummyMessage('a')))));
$this->assertSame(array(\get_class($sender) => $sender), iterator_to_array($locator->getSenders(new Envelope(new DummyMessage('a')))));
$this->assertSame(array(), iterator_to_array($locator->getSenders(new Envelope(new SecondMessage()))));
}

public function testItYieldsPorvidedSenderNameAsKey()
{
$sender = $this->getMockBuilder(SenderInterface::class)->getMock();
$locator = new SendersLocator(array(
DummyMessage::class => array('dummy' => $sender),
));

$this->assertSame(array('dummy' => $sender), iterator_to_array($locator->getSenders(new Envelope(new DummyMessage('a')))));
}
}
Expand Up @@ -46,9 +46,9 @@ public function getSenders(Envelope $envelope, ?bool &$handle = false): iterable
$seen = array();

foreach (HandlersLocator::listTypes($envelope) as $type) {
foreach ($this->senders[$type] ?? array() as $sender) {
foreach ($this->senders[$type] ?? array() as $name => $sender) {
if (!\in_array($sender, $seen, true)) {
yield $seen[] = $sender;
yield \is_string($name) ? $name : \get_class($sender) => $seen[] = $sender;
}
}
$handle = $handle ?: $this->sendAndHandle[$type] ?? false;
Expand Down
Expand Up @@ -29,7 +29,7 @@ interface SendersLocatorInterface
* @param bool|null &$handle True after calling the method when the next middleware
* should also get the message; false otherwise
*
* @return iterable|SenderInterface[]
* @return iterable|SenderInterface[] Indexed by sender name or FQCN
*/
public function getSenders(Envelope $envelope, ?bool &$handle = false): iterable;
}

0 comments on commit c1308e6

Please sign in to comment.