8000 [Messenger] internal cleanups · symfony/symfony@bbcdf31 · GitHub
[go: up one dir, main page]

Skip to content

Commit bbcdf31

Browse files
[Messenger] internal cleanups
1 parent aa1a823 commit bbcdf31

27 files changed

+145
-149
lines changed

src/Symfony/Component/Messenger/Asynchronous/Middleware/SendMessageMiddleware.php

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,21 +45,17 @@ public function handle($envelope, callable $next)
4545
return $next($envelope);
4646
}
4747

48-
$sender = $this->senderLocator->getSenderForMessage($envelope->getMessage());
48+
$sender = $this->senderLocator->getSender($envelope);
4949

5050
if ($sender) {
5151
$sender->send($envelope);
5252

53-
if (!$this->mustSendAndHandle($envelope->getMessage())) {
53+
if (!AbstractSenderLocator::getValueFromMessageRouting($this->messagesToSendAndHandleMapping, $envelope)) {
54+
// message has no corresponding handler
5455
return;
5556
}
5657
}
5758

5859
return $next($envelope);
5960
}
60-
61-
private function mustSendAndHandle($message): bool
62-
{
63-
return (bool) AbstractSenderLocator::getValueFromMessageRouting($this->messagesToSendAndHandleMapping, $message);
64-
}
6561
}

src/Symfony/Component/Messenger/Asynchronous/Routing/AbstractSenderLocator.php

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,28 +11,33 @@
1111

1212
namespace Symfony\Component\Messenger\Asynchronous\Routing;
1313

14+
use Symfony\Component\Messenger\Envelope;
15+
1416
/**
1517
* @author Samuel Roze <samuel.roze@gmail.com>
1618
*
1719
* @internal
1820
*/
1921
abstract class AbstractSenderLocator implements SenderLocatorInterface
2022
{
21-
public static function getValueFromMessageRouting(array $mapping, $message)
23+
public static function getValueFromMessageRouting(array $mapping, Envelope $envelope)
2224
{
23-
if (isset($mapping[\get_class($message)])) {
24-
return $mapping[\get_class($message)];
25-
}
26-
if ($parentsMapping = array_intersect_key($mapping, class_parents($message))) {
27-
return current($parentsMapping);
25+
if (isset($mapping[$class = \get_class($envelope->getMessage())])) {
26+
return $mapping[$class];
2827
}
29-
if ($interfaceMapping = array_intersect_key($mapping, class_implements($message))) {
30-
return current($interfaceMapping);
28+
29+
foreach (class_parents($class) as $name) {
30+
if (isset($mapping[$name])) {
31+
return $mapping[$name];
32+
}
3133
}
32-
if (isset($mapping['*'])) {
33-
return $mapping['*'];
34+
35+
foreach (class_implements($class) as $name) {
36+
if (isset($mapping[$name])) {
37+
return $mapping[$name];
38+
}
3439
}
3540

36-
return null;
41+
return $mapping['*'] ?? null;
3742
}
3843
}

src/Symfony/Component/Messenger/Asynchronous/Routing/ContainerSenderLocator.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
namespace Symfony\Component\Messenger\Asynchronous\Routing;
1313

1414
use Psr\Container\ContainerInterface;
15+
use Symfony\Component\Messenger\Envelope;
1516
use Symfony\Component\Messenger\Transport\SenderInterface;
1617

1718
/**
@@ -31,9 +32,9 @@ public function __construct(ContainerInterface $senderServiceLocator, array $mes
3132
/**
3233
* {@inheritdoc}
3334
*/
34-
public function getSenderForMessage($message): ?SenderInterface
35+
public function getSender(Envelope $envelope): ?SenderInterface
3536
{
36-
$senderId = self::getValueFromMessageRouting($this->messageToSenderIdMapping, $message);
37+
$senderId = self::getValueFromMessageRouting($this->messageToSenderIdMapping, $envelope);
3738

3839
return $senderId ? $this->senderServiceLocator->get($senderId) : null;
3940
}

src/Symfony/Component/Messenger/Asynchronous/Routing/SenderLocator.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace Symfony\Component\Messenger\Asynchronous\Routing;
1313

14+
use Symfony\Component\Messenger\Envelope;
1415
use Symfony\Component\Messenger\Exception\RuntimeException;
1516
use Symfony\Component\Messenger\Transport\SenderInterface;
1617

@@ -29,15 +30,15 @@ public function __construct(array $messageToSenderMapping)
2930
/**
3031
* {@inheritdoc}
3132
*/
32-
public function getSenderForMessage($message): ?SenderInterface
33+
public function getSender(Envelope $envelope): ?SenderInterface
3334
{
34-
$sender = self::getValueFromMessageRouting($this->messageToSenderMapping, $message);
35+
$sender = self::getValueFromMessageRouting($this->messageToSenderMapping, $envelope);
3536
if (null === $sender) {
3637
return null;
3738
}
3839

3940
if (!$sender instanceof SenderInterface) {
40-
throw new RuntimeException(sprintf('The sender instance provided for message "%s" should be of type "%s" but got "%s".', \get_class($message), SenderInterface::class, \is_object($sender) ? \get_class($sender) : \gettype($sender)));
41+
throw new RuntimeException(sprintf('The sender instance provided for message "%s" should be of type "%s" but got "%s".', \get_class($envelope->getMessage()), SenderInterface::class, \is_object($sender) ? \get_class($sender) : \gettype($sender)));
4142
}
4243

4344
return $sender;

src/Symfony/Component/Messenger/Asynchronous/Routing/SenderLocatorInterface.php

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace Symfony\Component\Messenger\Asynchronous\Routing;
1313

14+
use Symfony\Component\Messenger\Envelope;
1415
use Symfony\Component\Messenger\Transport\SenderInterface;
1516

1617
/**
@@ -21,10 +22,6 @@ interface SenderLocatorInterface
2122
{
2223
/**
2324
* Gets the sender (if applicable) for the given message object.
24-
*
25-
* @param object $message
26-
*
27-
* @return SenderInterface|null
2825
*/
29-
public function getSenderForMessage($message): ?SenderInterface;
26+
public function getSender(Envelope $envelope): ?SenderInterface;
3027
}

src/Symfony/Component/Messenger/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ CHANGELOG
1919
* [BC BREAK] The `EncoderInterface` and `DecoderInterface` have been replaced by a unified `Symfony\Component\Messenger\Transport\Serialization\SerializerInterface`.
2020
* [BC BREAK] The locator passed to `ContainerHandlerLocator` should not prefix its keys by "handler." anymore
2121
* [BC BREAK] The `AbstractHandlerLocator::getHandler()` method uses `?callable` as return type
22+
* [BC BREAK] `SenderLocatorInterface::getSenderForMessage()` has been replaced by `getSender(Envelope $envelope)`
23+
* [BC BREAK] `MessengerDataCollector::getMessages()` returns an iterable, not just an array anymore
24+
* [BC BREAK] `AbstractHandlerLocator` is now internal
25+
* [BC BREAK] `HandlerLocatorInterface::resolve()` has been replaced by `getHandler(Envelope $envelope, bool $allowNoHandler = false)`
26+
* [BC BREAK] `SenderLocatorInterface::getSenderForMessage()` has been replaced by `getSender(Envelope $envelope)`
27+
* [BC BREAK] `SenderInterface::send()` returns `void`
2228

2329
4.1.0
2430
-----

src/Symfony/Component/Messenger/DataCollector/MessengerDataCollector.php

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
use Symfony\Component\HttpKernel\DataCollector\LateDataCollectorInterface;
1818
use Symfony\Component\Messenger\TraceableMessageBus;
1919
use Symfony\Component\VarDumper\Caster\ClassStub;
20-
use Symfony\Component\VarDumper\Cloner\Data;
2120

2221
/**
2322
* @author Samuel Roze <samuel.roze@gmail.com>
@@ -55,14 +54,10 @@ public function lateCollect()
5554
}
5655

5756
// Order by call time
58-
usort($messages, function (array $a, array $b): int {
59-
return $a[1] > $b[1] ? 1 : -1;
60-
});
57+
usort($messages, function ($a, $b) { return $a[1] <=> $b[1]; });
6158

6259
// Keep the messages clones only
63-
$this->data['messages'] = array_map(function (array $item): Data {
64-
return $item[0];
65-
}, $messages);
60+
$this->data['messages'] = array_column($messages, 0);
6661
}
6762

6863
/**
@@ -120,18 +115,21 @@ private function collectMessage(string $busName, array $tracedMessage)
120115

121116
public function getExceptionsCount(string $bus = null): int
122117
{
123-
return array_reduce($this->getMessages($bus), function (int $carry, Data $message) {
124-
return $carry += isset($message['exception']) ? 1 : 0;
125-
}, 0);
118+
$count = 0;
119+
foreach ($this->getMessages($bus) as $message) {
120+
$count += (int) isset($message['exception']);
121+
}
122+
123+
return $count;
126124
}
127125

128-
public function getMessages(string $bus = null): array
126+
public function getMessages(string $bus = null): iterable
129127
{
130-
$messages = $this->data['messages'] ?? array();
131-
132-
return $bus ? array_filter($messages, function (Data $message) use ($bus): bool {
133-
return $bus === $message['bus'];
134-
}) : $messages;
128+
foreach ($this->data['messages'] ?? array() as $message) {
129+
if (null === $bus || $bus === $message['bus']) {
130+
yield $message;
131+
}
132+
}
135133
}
136134

137135
public function getBuses(): array

src/Symfony/Component/Messenger/Envelope.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ final class Envelope
2727
*/
2828
public function __construct($message, array $items = array())
2929
{
30+
if (!\is_object($message)) {
31+
throw new \TypeError(sprintf('Invalid argument provided to "%s()": expected object but got %s.', __METHOD__, \gettype($message)));
32+
}
3033
$this->message = $message;
3134
foreach ($items as $item) {
3235
$this->items[\get_class($item)] = $item;

src/Symfony/Component/Messenger/Handler/ChainHandler.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class ChainHandler
3030
*/
3131
public function __construct(array $handlers)
3232
{
33-
if (empty C2EE ($handlers)) {
33+
if (!$handlers) {
3434
throw new InvalidArgumentException('A collection of message handlers requires at least one handler.');
3535
}
3636

src/Symfony/Component/Messenger/Handler/Locator/AbstractHandlerLocator.php

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,36 +11,41 @@
1111

1212
namespace Symfony\Component\Messenger\Handler\Locator;
1313

14+
use Symfony\Component\Messenger\Envelope;
1415
use Symfony\Component\Messenger\Exception\NoHandlerForMessageException;
1516

1617
/**
1718
* @author Miha Vrhovnik <miha.vrhovnik@gmail.com>
1819
* @author Samuel Roze <samuel.roze@gmail.com>
20+
*
21+
* @internal
1922
*/
2023
abstract class AbstractHandlerLocator implements HandlerLocatorInterface
2124
{
22-
public function resolve($message): callable
25+
public function getHandler(Envelope $envelope, bool $allowNoHandler = false): ?callable
2326
{
24-
$class = \get_class($message);
27+
$class = \get_class($envelope->getMessage());
2528

26-
if ($handler = $this->getHandler($class)) {
29+
if ($handler = $this->getHandlerByName($class)) {
2730
return $handler;
2831
}
2932

30-
foreach (class_implements($class, false) as $interface) {
31-
if ($handler = $this->getHandler($interface)) {
33+
foreach (class_implements($class) as $name) {
34+
if ($handler = $this->getHandlerByName($name)) {
3235
return $handler;
3336
}
3437
}
3538

36-
foreach (class_parents($class, false) as $parent) {
37-
if ($handler = $this->getHandler($parent)) {
39+
foreach (class_parents($class) as $name) {
40+
if ($handler = $this->getHandlerByName($name)) {
3841
return $handler;
3942
}
4043
}
4144

42-
throw new NoHandlerForMessageException(sprintf('No handler for message "%s".', $class));
45+
if (!$allowNoHandler) {
46+
throw new NoHandlerForMessageException(sprintf('No handler for message "%s".', $class));
47+
}
4348
}
4449

45-
abstract protected function getHandler(string $class): ?callable;
50+
abstract protected function getHandlerByName(string $name): ?callable;
4651
}

src/Symfony/Component/Messenger/Handler/Locator/ContainerHandlerLocator.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ public function __construct(ContainerInterface $container)
2929
/**
3030
* {@inheritdoc}
3131
*/
32-
protected function getHandler(string $class): ?callable
32+
protected function getHandlerByName(string $name): ?callable
3333
{
34-
return $this->container->has($class) ? $this->container->get($class) : null;
34+
return $this->container->has($name) ? $this->container->get($name) : null;
3535
}
3636
}

src/Symfony/Component/Messenger/Handler/Locator/HandlerLocator.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ public function __construct(array $messageToHandlerMapping = array())
2929
/**
3030
* {@inheritdoc}
3131
*/
32-
protected function getHandler(string $class): ?callable
32+
protected function getHandlerByName(string $name): ?callable
3333
{
34-
return $this->messageToHandlerMapping[$class] ?? null;
34+
return $this->messageToHandlerMapping[$name] ?? null;
3535
}
3636
}

src/Symfony/Component/Messenger/Handler/Locator/HandlerLocatorInterface.php

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace Symfony\Component\Messenger\Handler\Locator;
1313

14+
use Symfony\Component\Messenger\Envelope;
1415
use Symfony\Component\Messenger\Exception\NoHandlerForMessageException;
1516

1617
/**
@@ -21,11 +22,7 @@ interface HandlerLocatorInterface
2122
/**
2223
* Returns the handler for the given message.
2324
*
24-
* @param object $message
25-
*
26-
* @throws NoHandlerForMessageException
27-
*
28-
* @return callable
25+
* @throws NoHandlerForMessageException When no handler is found and $allowNoHandler is false
2926
*/
30-
public function resolve($message): callable;
27+
public function getHandler(Envelope $envelope, bool $allowNoHandler = false): ?callable;
3128
}

src/Symfony/Component/Messenger/Middleware/HandleMessageMiddleware.php

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,29 +11,31 @@
1111

1212
namespace Symfony\Component\Messenger\Middleware;
1313

14+
use Symfony\Component\Messenger\Envelope;
15+
use Symfony\Component\Messenger\EnvelopeAwareInterface;
1416
use Symfony\Component\Messenger\Handler\Locator\HandlerLocatorInterface;
1517

1618
/**
1719
* @author Samuel Roze <samuel.roze@gmail.com>
1820
*/
19-
class HandleMessageMiddleware implements MiddlewareInterface
21+
class HandleMessageMiddleware implements MiddlewareInterface, EnvelopeAwareInterface
2022
{
21-
private $messageHandlerResolver;
23+
private $messageHandlerLocator;
2224

23-
public function __construct(HandlerLocatorInterface $messageHandlerResolver)
25+
public function __construct(HandlerLocatorInterface $messageHandlerLocator)
2426
{
25-
$this->messageHandlerResolver = $messageHandlerResolver;
27+
$this->messageHandlerLocator = $messageHandlerLocator;
2628
}
2729

2830
/**
29-
* {@inheritdoc}
31+
* @param Envelope $envelope
3032
*/
31-
public function handle($message, callable $next)
33+
public function handle($envelope, callable $next)
3234
{
33-
$handler = $this->messageHandlerResolver->resolve($message);
34-
$result = $handler($message);
35+
$handler = $this->messageHandlerLocator->getHandler($envelope);
36+
$result = $handler($envelope->getMessage());
3537

36-
$next($message);
38+
$next($envelope);
3739

3840
return $result;
3941
}

src/Symfony/Component/Messenger/Middleware/LoggingMiddleware.php

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -30,29 +30,23 @@ public function __construct(LoggerInterface $logger)
3030
*/
3131
public function handle($message, callable $next)
3232
{
33-
$this->logger->debug('Starting handling message {class}', $this->createContext($message));
33+
$context = array(
34+
'message' => $message,
35+
'name' => \get_class($message),
36+
);
37+
$this->logger->debug('Starting handling message {name}', $context);
3438

3539
try {
3640
$result = $next($message);
3741
} catch (\Throwable $e) {
38-
$this->logger->warning('An exception occurred while handling message {class}', array_merge(
39-
$this->createContext($message),
40-
array('exception' => $e)
41-
));
42+
$context['exception'] = $e;
43+
$this->logger->warning('An exception occurred while handling message {name}', $context);
4244

4345
throw $e;
4446
}
4547

46-
$this->logger->debug('Finished handling message {class}', $this->createContext($message));
48+
$this->logger->debug('Finished handling message {name}', $context);
4749

4850
return $result;
4951
}
50-
51-
private function createContext($message): array
52-
{
53-
return array(
54-
'message' => $message,
55-
'class' => \get_class($message),
56-
);
57-
}
5852
}

0 commit comments

Comments
 (0)
0