Просмотр исходного кода

Merge remote branch 'thesalla/mailhandler' into mailhandler

Christophe Coevoet 14 лет назад
Родитель
Сommit
f9590bb545

+ 151 - 0
src/Monolog/Handler/MailHandler.php

@@ -0,0 +1,151 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+/**
+ * Base class for all mail handlers
+ * 
+ * @author Gyula Sallai
+ */
+abstract class MailHandler extends AbstractHandler
+{
+    
+    protected $messageFormat;
+    
+    /**
+     * {@inheritdoc}
+     */
+    public function handle(array $record)
+    {
+        if ($record['level'] < $this->level) {
+            return false;
+        }
+        
+        $record = $this->prepareRecord($record);
+        
+        $this->write($record);
+        
+        return false === $this->bubble;
+    }
+    
+    /**
+     * {@inheritdoc}
+     */
+    public function handleBatch(array $records)
+    {   
+        $messages = array();
+        
+        foreach ($records as $record) {
+            if ($record['level'] < $this->level) {
+                continue;
+            }
+            
+            $record = $this->prepareRecord($record);
+            $messages[] = $record['message'];
+        }
+        
+        if (!empty($messages)) {
+            $this->send($this->createMessage($messages));
+        }
+    }
+    
+    /**
+     * Set the message format
+     * 
+     * @param string $format
+     */
+    public function setMessageFormat($format)
+    {
+        $this->messageFormat = $format;
+    }
+    
+    /**
+     * Get the message format
+     * 
+     * @return string
+     */
+    public function getMessageFormat()
+    {
+        return $this->messageFormat;
+    }
+        
+    /**
+     * Send a mail with the given content
+     * 
+     * @param string $content
+     */
+    abstract protected function send($content); 
+    
+    /**
+     * {@inheritdoc}
+     */
+    protected function write(array $record)
+    {
+        $content = $record['message'];
+        
+        $this->send($content);
+    }
+    
+    /**
+     * Create a message to send from the given log entry messages
+     * 
+     * @param array $messages
+     * 
+     * @return string
+     */
+    protected function createMessage(array $messages)
+    {
+        if (null === $this->messageFormat) {
+            $this->messageFormat = $this->getDefaultMessageFormat();
+        }
+        
+        $message = str_replace('%records%', implode('', $messages), $this->messageFormat);
+        
+        return $message;
+    }
+    
+    /**
+     * Prepare a record for writing
+     * 
+     * This method is just a shortcut for the common handling process (except writing)
+     * 
+     * @param array $record
+     * 
+     * @return array
+     */
+    protected function prepareRecord(array $record)
+    {
+        if ($this->processors) {
+            foreach ($this->processors as $processor) {
+                $record = call_user_func($processor, $record);
+            }
+        }
+
+        if (!$this->formatter) {
+            $this->formatter = $this->getDefaultFormatter();
+        }
+        $record = $this->formatter->format($record);
+        
+        return $record;
+    }
+    
+    /**
+     * Get the default mail message format
+     * 
+     * @return string
+     */
+    protected function getDefaultMessageFormat()
+    {
+        return 'Application logs:\n %records%';
+    }
+    
+}

+ 53 - 0
src/Monolog/Handler/SwiftMailerHandler.php

@@ -0,0 +1,53 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Monolog\Logger;
+
+/**
+ * SwiftMailerHandler uses Swift_Mailer to send the emails
+ * 
+ * @author Gyula Sallai
+ */
+class SwiftMailerHandler extends MailHandler
+{
+    
+    protected $mailer;
+    protected $message;
+    
+    /**
+     * @param \Swift_Mailer $mailer The mailer to use
+     * @param \Swift_Message $message An example message for real messages,
+     *                                only the body will be replaced
+     * @param integer $level The minimum logging level at which this handler will be triggered
+     * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not
+     */
+    public function __construct(\Swift_Mailer $mailer, \Swift_Message $message, $level = Logger::ERROR, $bubble = false)
+    {
+        $this->mailer  = $mailer;
+        $this->message = $message;
+        $this->level   = $level;
+        $this->bubble  = $bubble;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function send($content)
+    {
+        $message = clone $this->message;
+        $message->setBody($content);
+        
+        $this->mailer->send($message);
+    }
+    
+}

+ 67 - 0
tests/Monolog/Handler/MailHandlerTest.php

@@ -0,0 +1,67 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Monolog\Logger;
+
+use Monolog\TestCase;
+
+class MailHandlerTest extends TestCase
+{
+    
+    public function testHandleBatch()
+    {
+        $records = $this->getMultipleRecords();
+        
+        $formatter = $this->getMock('Monolog\Formatter\LineFormatter');
+        $formatter->expects($this->exactly(count($records)))
+            ->method('format'); // Each record is formatted
+        
+        $handler = $this->getMockForAbstractClass('Monolog\\Handler\\MailHandler');
+        $handler->expects($this->once())
+            ->method('send');
+        $handler->expects($this->never())
+            ->method('write'); // write is for individual records
+        
+        $handler->setFormatter($formatter);
+        
+        $handler->handleBatch($records);
+    }
+    
+    public function testHandleBatchNotSendsMailIfMessagesAreBelowLevel()
+    {
+        $records = array(
+            $this->getRecord(Logger::DEBUG, 'debug message 1'),
+            $this->getRecord(Logger::DEBUG, 'debug message 2'),
+            $this->getRecord(Logger::INFO, 'information'),
+        );
+        
+        $handler = $this->getMockForAbstractClass('Monolog\\Handler\\MailHandler');
+        $handler->expects($this->never())
+            ->method('send');
+        $handler->setLevel(Logger::ERROR);
+        
+        $handler->handleBatch($records);
+    }
+    
+    public function testHandle()
+    {
+        $record = $this->getRecord();
+        
+        $handler = $this->getMockForAbstractClass('Monolog\\Handler\\MailHandler');
+        $handler->expects($this->once())
+            ->method('send');
+            
+        $handler->handle($record);
+    }
+    
+}

+ 14 - 0
tests/Monolog/TestCase.php

@@ -28,6 +28,20 @@ class TestCase extends \PHPUnit_Framework_TestCase
         );
         );
     }
     }
 
 
+    /**
+     * @return array
+     */
+    protected function getMultipleRecords()
+    {
+        return array(
+            $this->getRecord(Logger::DEBUG, 'debug message 1'),
+            $this->getRecord(Logger::DEBUG, 'debug message 2'),
+            $this->getRecord(Logger::INFO, 'information'),
+            $this->getRecord(Logger::WARNING, 'warning'),
+            $this->getRecord(Logger::ERROR, 'error')
+        );
+    }
+    
     /**
     /**
      * @return Monolog\Formatter\FormatterInterface
      * @return Monolog\Formatter\FormatterInterface
      */
      */