From fea588c0554b970a024a1da4ac1810da868bfc18 Mon Sep 17 00:00:00 2001 From: John Kary Date: Sun, 1 Mar 2015 19:32:18 -0600 Subject: [PATCH] Swift_Message can now be customized based on logged data --- src/Monolog/Handler/SwiftMailerHandler.php | 7 ++-- .../Handler/SwiftMailerHandlerTest.php | 32 +++++++++++++++++-- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/Monolog/Handler/SwiftMailerHandler.php b/src/Monolog/Handler/SwiftMailerHandler.php index 382114fb..9237b1fd 100644 --- a/src/Monolog/Handler/SwiftMailerHandler.php +++ b/src/Monolog/Handler/SwiftMailerHandler.php @@ -42,22 +42,23 @@ class SwiftMailerHandler extends MailHandler */ protected function send($content, array $records) { - $this->mailer->send($this->buildMessage($content)); + $this->mailer->send($this->buildMessage($content, $records)); } /** * Creates instance of Swift_Message to be sent * * @param string $content + * @param array $records Log records that formed the content * @return \Swift_Message */ - protected function buildMessage($content) + protected function buildMessage($content, array $records) { $message = null; if ($this->message instanceof \Swift_Message) { $message = clone $this->message; } else if (is_callable($this->message)) { - $message = call_user_func($this->message); + $message = call_user_func($this->message, $content, $records); } if (!$message instanceof \Swift_Message) { diff --git a/tests/Monolog/Handler/SwiftMailerHandlerTest.php b/tests/Monolog/Handler/SwiftMailerHandlerTest.php index 268c742e..ac885220 100644 --- a/tests/Monolog/Handler/SwiftMailerHandlerTest.php +++ b/tests/Monolog/Handler/SwiftMailerHandlerTest.php @@ -28,10 +28,38 @@ class SwiftMailerHandlerTest extends TestCase }; $handler = new SwiftMailerHandler($this->mailer, $callback); - $records = [ + $records = array( $this->getRecord(Logger::DEBUG), $this->getRecord(Logger::INFO), - ]; + ); + $handler->handleBatch($records); + } + + public function testMessageCanBeCustomizedGivenLoggedData() + { + // Wire Mailer to expect a specific Swift_Message with a customized Subject + $expectedMessage = new \Swift_Message(); + $this->mailer->expects($this->once()) + ->method('send') + ->with($this->callback(function ($value) use ($expectedMessage) { + return $value instanceof \Swift_Message + && $value->getSubject() === 'Emergency' + && $value === $expectedMessage; + })); + + // Callback dynamically changes subject based on number of logged records + $callback = function ($content, array $records) use ($expectedMessage) { + $subject = count($records) > 0 ? 'Emergency' : 'Normal'; + $expectedMessage->setSubject($subject); + + return $expectedMessage; + }; + $handler = new SwiftMailerHandler($this->mailer, $callback); + + // Logging 1 record makes this an Emergency + $records = array( + $this->getRecord(Logger::EMERGENCY), + ); $handler->handleBatch($records); } }