From 14232290ee7950c3c9b3697e109fc3e73012a189 Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Wed, 27 Oct 2021 15:28:33 +0200 Subject: [PATCH] [Messenger] Fix `TraceableMessageBus` implementation so it can compute caller even when used within a callback --- .../Tests/TraceableMessageBusTest.php | 18 ++++++++++++++++++ .../Messenger/TraceableMessageBus.php | 13 ++++++++----- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/Symfony/Component/Messenger/Tests/TraceableMessageBusTest.php b/src/Symfony/Component/Messenger/Tests/TraceableMessageBusTest.php index d0b7db99e0c9d..0b57cf37bad6c 100644 --- a/src/Symfony/Component/Messenger/Tests/TraceableMessageBusTest.php +++ b/src/Symfony/Component/Messenger/Tests/TraceableMessageBusTest.php @@ -156,4 +156,22 @@ public function testItTracesExceptions() ], ], $actualTracedMessage); } + + public function testItTracesExceptionsWhenMessageBusIsFiredFromArrayCallback() + { + $message = new DummyMessage('Hello'); + $exception = new \RuntimeException(); + + $bus = $this->createMock(MessageBusInterface::class); + $bus->expects($this->once()) + ->method('dispatch') + ->with($message) + ->willThrowException($exception); + + $traceableBus = new TraceableMessageBus($bus); + + $this->expectExceptionObject($exception); + + array_map([$traceableBus, 'dispatch'], [$message]); + } } diff --git a/src/Symfony/Component/Messenger/TraceableMessageBus.php b/src/Symfony/Component/Messenger/TraceableMessageBus.php index 560b829e50981..01d4c24e1bf7a 100644 --- a/src/Symfony/Component/Messenger/TraceableMessageBus.php +++ b/src/Symfony/Component/Messenger/TraceableMessageBus.php @@ -62,8 +62,8 @@ private function getCaller(): array { $trace = debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS, 8); - $file = $trace[1]['file']; - $line = $trace[1]['line']; + $file = $trace[1]['file'] ?? null; + $line = $trace[1]['line'] ?? null; $handleTraitFile = (new \ReflectionClass(HandleTrait::class))->getFileName(); $found = false; @@ -97,9 +97,12 @@ private function getCaller(): array } } - $name = str_replace('\\', '/', $file); - $name = substr($name, strrpos($name, '/') + 1); + $name = str_replace('\\', '/', (string) $file); - return compact('name', 'file', 'line'); + return [ + 'name' => substr($name, strrpos($name, '/') + 1), + 'file' => $file, + 'line' => $line, + ]; } }