diff --git a/composer.json b/composer.json index 08aea699..526f6fe8 100644 --- a/composer.json +++ b/composer.json @@ -23,7 +23,8 @@ "ruflin/elastica": "0.90.*", "doctrine/couchdb": "~1.0@dev", "aws/aws-sdk-php": "~2.4, >2.4.8", - "videlalvaro/php-amqplib": "~2.4" + "videlalvaro/php-amqplib": "~2.4", + "swiftmailer/swiftmailer": "~5.3" }, "suggest": { "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", diff --git a/src/Monolog/Handler/SwiftMailerHandler.php b/src/Monolog/Handler/SwiftMailerHandler.php index af321db2..382114fb 100644 --- a/src/Monolog/Handler/SwiftMailerHandler.php +++ b/src/Monolog/Handler/SwiftMailerHandler.php @@ -32,13 +32,8 @@ class SwiftMailerHandler extends MailHandler public function __construct(\Swift_Mailer $mailer, $message, $level = Logger::ERROR, $bubble = true) { parent::__construct($level, $bubble); - $this->mailer = $mailer; - if (!$message instanceof \Swift_Message && is_callable($message)) { - $message = call_user_func($message); - } - if (!$message instanceof \Swift_Message) { - throw new \InvalidArgumentException('You must provide either a Swift_Message instance or a callable returning it'); - } + + $this->mailer = $mailer; $this->message = $message; } @@ -47,10 +42,31 @@ class SwiftMailerHandler extends MailHandler */ protected function send($content, array $records) { - $message = clone $this->message; + $this->mailer->send($this->buildMessage($content)); + } + + /** + * Creates instance of Swift_Message to be sent + * + * @param string $content + * @return \Swift_Message + */ + protected function buildMessage($content) + { + $message = null; + if ($this->message instanceof \Swift_Message) { + $message = clone $this->message; + } else if (is_callable($this->message)) { + $message = call_user_func($this->message); + } + + if (!$message instanceof \Swift_Message) { + throw new \InvalidArgumentException('Could not resolve message as instance of Swift_Message or a callable returning it'); + } + $message->setBody($content); $message->setDate(time()); - $this->mailer->send($message); + return $message; } } diff --git a/tests/Monolog/Handler/SwiftMailerHandlerTest.php b/tests/Monolog/Handler/SwiftMailerHandlerTest.php new file mode 100644 index 00000000..268c742e --- /dev/null +++ b/tests/Monolog/Handler/SwiftMailerHandlerTest.php @@ -0,0 +1,37 @@ +mailer = $this + ->getMockBuilder('Swift_Mailer') + ->disableOriginalConstructor() + ->getMock(); + } + + public function testMessageCreationIsLazyWhenUsingCallback() + { + $this->mailer->expects($this->never()) + ->method('send'); + + $callback = function () { + throw new \RuntimeException('Swift_Message creation callback should not have been called in this test'); + }; + $handler = new SwiftMailerHandler($this->mailer, $callback); + + $records = [ + $this->getRecord(Logger::DEBUG), + $this->getRecord(Logger::INFO), + ]; + $handler->handleBatch($records); + } +}