Przeglądaj źródła

Swift_Message can now be customized based on logged data

John Kary 11 lat temu
rodzic
commit
fea588c055

+ 4 - 3
src/Monolog/Handler/SwiftMailerHandler.php

@@ -42,22 +42,23 @@ class SwiftMailerHandler extends MailHandler
      */
      */
     protected function send($content, array $records)
     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
      * Creates instance of Swift_Message to be sent
      *
      *
      * @param string $content
      * @param string $content
+     * @param array  $records Log records that formed the content
      * @return \Swift_Message
      * @return \Swift_Message
      */
      */
-    protected function buildMessage($content)
+    protected function buildMessage($content, array $records)
     {
     {
         $message = null;
         $message = null;
         if ($this->message instanceof \Swift_Message) {
         if ($this->message instanceof \Swift_Message) {
             $message = clone $this->message;
             $message = clone $this->message;
         } else if (is_callable($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) {
         if (!$message instanceof \Swift_Message) {

+ 30 - 2
tests/Monolog/Handler/SwiftMailerHandlerTest.php

@@ -28,10 +28,38 @@ class SwiftMailerHandlerTest extends TestCase
         };
         };
         $handler = new SwiftMailerHandler($this->mailer, $callback);
         $handler = new SwiftMailerHandler($this->mailer, $callback);
 
 
-        $records = [
+        $records = array(
             $this->getRecord(Logger::DEBUG),
             $this->getRecord(Logger::DEBUG),
             $this->getRecord(Logger::INFO),
             $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);
         $handler->handleBatch($records);
     }
     }
 }
 }