Skip to content

Commit

Permalink
SentStamp: split sender alias & class, HandledStamp: mandatory handle…
Browse files Browse the repository at this point in the history
…r descr
  • Loading branch information
ogizanagi committed Nov 12, 2018
1 parent 8d09d8b commit 583d772
Show file tree
Hide file tree
Showing 7 changed files with 29 additions and 25 deletions.
Expand Up @@ -44,7 +44,7 @@ public function handle(Envelope $envelope, StackInterface $stack): Envelope
$sender = null;

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

if (null === $sender || $handle) {
Expand Down
22 changes: 9 additions & 13 deletions src/Symfony/Component/Messenger/Stamp/HandledStamp.php
Expand Up @@ -28,9 +28,9 @@ final class HandledStamp implements StampInterface

/**
* @param mixed $result The returned value of the message handler
* @param string|null $handler A handler description if available
* @param string|null $handler A handler description
*/
public function __construct($result, string $handler = null)
public function __construct($result, string $handler)
{
$this->result = $result;
$this->handler = $handler;
Expand All @@ -40,14 +40,14 @@ public static function fromCallable(callable $handler, $result): self
{
if (\is_array($handler)) {
if (\is_object($handler[0])) {
return new self($result, sprintf('%s::%s()', \get_class($handler[0]), $handler[1]));
return new self($result, \get_class($handler[0])."::$handler[1]()");
}

return new self($result, sprintf('%s::%s()', $handler[0], $handler[1]));
return new self($result, "$handler[0]::$handler[1]()");
}

if (\is_string($handler)) {
return new self($result, sprintf('%s()', $handler));
return new self($result, "$handler()");
}

if ($handler instanceof \Closure) {
Expand All @@ -56,25 +56,21 @@ public static function fromCallable(callable $handler, $result): self
return new self($result, 'Closure()');
}
if ($class = $r->getClosureScopeClass()) {
return new self($result, sprintf('%s::%s()', $class->getName(), $r->name));
return new self($result, "{$class->getName()}::$r->name()");
}

return new self($result, $r->name.'()');
return new self($result, "$r->name()");
}

if (method_exists($handler, '__invoke')) {
return new self($result, sprintf('%s::__invoke()', \get_class($handler)));
}

return new self($result);
return new self($result, \get_class($handler).'::__invoke()');
}

public function getResult()
{
return $this->result;
}

public function getHandler(): ?string
public function getHandler(): string
{
return $this->handler;
}
Expand Down
17 changes: 12 additions & 5 deletions src/Symfony/Component/Messenger/Stamp/SentStamp.php
Expand Up @@ -22,15 +22,22 @@
*/
final class SentStamp implements StampInterface
{
private $sender;
private $senderClass;
private $senderAlias;

public function __construct(string $sender = null)
public function __construct(string $senderClass, string $senderAlias = null)
{
$this->sender = $sender;
$this->senderAlias = $senderAlias;
$this->senderClass = $senderClass;
}

public function getSender(): string
public function getSenderClass(): string
{
return $this->sender;
return $this->senderClass;
}

public function getSenderAlias(): ?string
{
return $this->senderAlias;
}
}
Expand Up @@ -38,7 +38,8 @@ public function testItSendsTheMessageToAssignedSender()

/* @var SentStamp $stamp */
$this->assertInstanceOf(SentStamp::class, $stamp = $envelope->last(SentStamp::class), 'it adds a sent stamp');
$this->assertStringMatchesFormat('Mock_SenderInterface_%s', $stamp->getSender());
$this->assertNull($stamp->getSenderAlias());
$this->assertStringMatchesFormat('Mock_SenderInterface_%s', $stamp->getSenderClass());
}

public function testItSendsTheMessageToAssignedSenderWithPreWrappedMessage()
Expand Down
Expand Up @@ -27,11 +27,11 @@ public function testItReturnsTheSenderBasedOnTheMessageClass()
DummyMessage::class => array($sender),
));

$this->assertSame(array(\get_class($sender) => $sender), iterator_to_array($locator->getSenders(new Envelope(new DummyMessage('a')))));
$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()))));
}

public function testItYieldsPorvidedSenderNameAsKey()
public function testItYieldsProvidedSenderNameAsKey()
{
$sender = $this->getMockBuilder(SenderInterface::class)->getMock();
$locator = new SendersLocator(array(
Expand Down
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 $name => $sender) {
foreach ($this->senders[$type] ?? array() as $alias => $sender) {
if (!\in_array($sender, $seen, true)) {
yield \is_string($name) ? $name : \get_class($sender) => $seen[] = $sender;
yield $alias => $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[] Indexed by sender name or FQCN
* @return iterable|SenderInterface[] Indexed by sender alias if available
*/
public function getSenders(Envelope $envelope, ?bool &$handle = false): iterable;
}

0 comments on commit 583d772

Please sign in to comment.