diff --git a/src/Event.php b/src/Event.php index a11e407c0..de3acef59 100644 --- a/src/Event.php +++ b/src/Event.php @@ -61,6 +61,11 @@ final class Event implements \JsonSerializable */ private $message; + /** + * @var string|null The formatted error message + */ + private $messageFormatted; + /** * @var array The parameters to use to format the message */ @@ -339,6 +344,16 @@ public function getMessage(): ?string return $this->message; } + /** + * Gets the formatted message. + * + * @return string|null + */ + public function getMessageFormatted(): ?string + { + return $this->messageFormatted; + } + /** * Gets the parameters to use to format the message. * @@ -352,13 +367,15 @@ public function getMessageParams(): array /** * Sets the error message. * - * @param string $message The message - * @param array $params The parameters to use to format the message + * @param string $message The message + * @param array $params The parameters to use to format the message + * @param string|null $formatted The formatted message */ - public function setMessage(string $message, array $params = []): void + public function setMessage(string $message, array $params = [], string $formatted = null): void { $this->message = $message; $this->messageParams = $params; + $this->messageFormatted = $formatted; } /** @@ -659,7 +676,7 @@ public function toArray(): array $data['message'] = [ 'message' => $this->message, 'params' => $this->messageParams, - 'formatted' => vsprintf($this->message, $this->messageParams), + 'formatted' => $this->messageFormatted ?? vsprintf($this->message, $this->messageParams), ]; } } diff --git a/src/EventFactory.php b/src/EventFactory.php index 774d41ab7..c1b114435 100644 --- a/src/EventFactory.php +++ b/src/EventFactory.php @@ -108,9 +108,10 @@ public function create(array $payload): Event $message = $payload['message'] ?? null; $messageParams = $payload['message_params'] ?? []; + $messageFormatted = isset($payload['message_formatted']) ? mb_substr($payload['message_formatted'], 0, $this->options->getMaxValueLength()) : null; if (null !== $message) { - $event->setMessage(substr($message, 0, $this->options->getMaxValueLength()), $messageParams); + $event->setMessage(mb_substr($message, 0, $this->options->getMaxValueLength()), $messageParams, $messageFormatted); } if (isset($payload['exception']) && $payload['exception'] instanceof \Throwable) { diff --git a/tests/EventFactoryTest.php b/tests/EventFactoryTest.php index a416e0913..12752ddbf 100644 --- a/tests/EventFactoryTest.php +++ b/tests/EventFactoryTest.php @@ -92,6 +92,20 @@ public function createWithPayloadDataProvider() ], ], ], + [ + [ + 'message' => 'testMessage @param', + 'message_params' => ['@param' => 'param'], + 'message_formatted' => 'testMessage param', + ], + [ + 'message' => [ + 'message' => 'testMessage @param', + 'params' => ['@param' => 'param'], + 'formatted' => 'testMessage param', + ], + ], + ], ]; } diff --git a/tests/EventTest.php b/tests/EventTest.php index 170a8c668..f818d0156 100644 --- a/tests/EventTest.php +++ b/tests/EventTest.php @@ -165,6 +165,38 @@ public function testToArrayWithBreadcrumbs(): void $this->assertSame($breadcrumbs, $data['breadcrumbs']['values']); } + public function testToArrayWithMessageWithFormatted(): void + { + $expected = [ + 'message' => 'foo @bar', + 'params' => ['@bar' => 'bar'], + 'formatted' => 'foo bar', + ]; + + $event = new Event(); + $event->setMessage('foo @bar', ['@bar' => 'bar'], 'foo bar'); + + $data = $event->toArray(); + + $this->assertArrayHasKey('message', $data); + $this->assertSame($expected, $data['message']); + } + + public function testGetMessage(): void + { + $event = new Event(); + $event->setMessage('foo @bar', ['@bar' => 'bar'], 'foo bar'); + $this->assertSame('foo @bar', $event->getMessage()); + $this->assertSame(['@bar' => 'bar'], $event->getMessageParams()); + $this->assertSame('foo bar', $event->getMessageFormatted()); + + $event = new Event(); + $event->setMessage('foo %s', ['bar']); + $this->assertSame('foo %s', $event->getMessage()); + $this->assertSame(['bar'], $event->getMessageParams()); + $this->assertNull($event->getMessageFormatted()); + } + public function testGetServerOsContext(): void { $event = new Event();