Browse Source

[MonologBundle] Added the support of SwiftMailerHandler and NativeMailerHandler

Christophe Coevoet 14 years ago
parent
commit
d8e6ab7f7a

+ 13 - 0
src/Symfony/Bundle/MonologBundle/DependencyInjection/Configuration.php

@@ -62,8 +62,13 @@ class Configuration implements ConfigurationInterface
                             ->scalarNode('facility')->defaultValue('user')->end() // syslog
                             ->scalarNode('max_files')->defaultValue(0)->end() // rotating
                             ->scalarNode('action_level')->defaultValue('WARNING')->end() // fingers_crossed
+                            ->booleanNode('stop_buffering')->defaultTrue()->end()// fingers_crossed
                             ->scalarNode('buffer_size')->defaultValue(0)->end() // fingers_crossed and buffer
                             ->scalarNode('handler')->end() // fingers_crossed and buffer
+                            ->scalarNode('from_email')->end() // swift_mailer and native_mailer
+                            ->scalarNode('to_email')->end() // swift_mailer and native_mailer
+                            ->scalarNode('subject')->end() // swift_mailer and native_mailer
+                            ->scalarNode('email_prototype')->end() // swift_mailer
                             ->scalarNode('formatter')->end()
                         ->end()
                         ->append($this->getProcessorsNode())
@@ -71,6 +76,14 @@ class Configuration implements ConfigurationInterface
                             ->ifTrue(function($v) { return ('fingers_crossed' === $v['type'] || 'buffer' === $v['type']) && 1 !== count($v['handler']); })
                             ->thenInvalid('The handler has to be specified to use a FingersCrossedHandler')
                         ->end()
+                        ->validate()
+                            ->ifTrue(function($v) { return 'swift_mailer' === $v['type'] && empty($v['email_prototype']) && (empty($v['from_email']) || empty($v['to_email']) || empty($v['subject'])); })
+                            ->thenInvalid('The sender, recipient and subject or an email prototype have to be specified to use a SwiftMailerHandler')
+                        ->end()
+                        ->validate()
+                            ->ifTrue(function($v) { return 'native_mailer' === $v['type'] && (empty($v['from_email']) || empty($v['to_email']) || empty($v['subject'])); })
+                            ->thenInvalid('The sender, recipient and subject have to be specified to use a NativeMailerHandler')
+                        ->end()
                         ->validate()
                             ->ifTrue(function($v) { return 'service' === $v['type'] && !isset($v['id']); })
                             ->thenInvalid('The id has to be specified to use a service as handler')

+ 42 - 4
src/Symfony/Bundle/MonologBundle/DependencyInjection/MonologExtension.php

@@ -146,6 +146,7 @@ class MonologExtension extends Extension
                 $handler['action_level'],
                 $handler['buffer_size'],
                 $handler['bubble'],
+                $handler['stop_buffering'],
             ));
             break;
 
@@ -170,6 +171,37 @@ class MonologExtension extends Extension
             ));
             break;
 
+        case 'swift_mailer':
+            if (isset($handler['email_prototype'])) {
+                $prototype = $this->parseDefinition($handler['email_prototype']);
+            } else {
+                $message = new Definition('Swift_Message');
+                $message->setPublic(false);
+                $message->addMethodCall('setFrom', $handler['from_email']);
+                $message->addMethodCall('setTo', $handler['to_email']);
+                $message->addMethodCall('setSubject', $handler['subject']);
+                $messageId = sprintf('%s.mail_prototype', $handlerId);
+                $container->setDefinition($messageId, $message);
+                $prototype = new Reference($messageId);
+            }
+            $definition->setArguments(array(
+                new Reference('mailer'),
+                $prototype,
+                $handler['level'],
+                $handler['bubble'],
+            ));
+            break;
+
+        case 'native_mailer':
+            $definition->setArguments(array(
+                $handler['to_email'],
+                $handler['subject'],
+                $handler['from_email'],
+                $handler['level'],
+                $handler['bubble'],
+            ));
+            break;
+
         // Handlers using the constructor of AbstractHandler without adding their own arguments
         case 'test':
         case 'null':
@@ -203,10 +235,16 @@ class MonologExtension extends Extension
     private function addProcessors(Definition $definition, array $processors)
     {
         foreach (array_reverse($processors) as $processor) {
-            if (0 === strpos($processor, '@')) {
-                $processor = new Reference(substr($processor, 1));
-            }
-            $definition->addMethodCall('pushProcessor', array($processor));
+            $definition->addMethodCall('pushProcessor', array($this->parseDefinition($processor)));
         }
     }
+
+    private function parseDefinition($definition)
+    {
+        if (0 === strpos($processor, '@')) {
+            return new Reference(substr($definition, 1));
+        }
+
+        return $definition;
+    }
 }

+ 2 - 0
src/Symfony/Bundle/MonologBundle/Resources/config/monolog.xml

@@ -13,6 +13,8 @@
         <parameter key="monolog.handler.syslog.class">Monolog\Handler\SyslogHandler</parameter>
         <parameter key="monolog.handler.null.class">Monolog\Handler\NullHandler</parameter>
         <parameter key="monolog.handler.test.class">Monolog\Handler\TestHandler</parameter>
+        <parameter key="monolog.handler.swift_mailer.class">Monolog\Handler\SwiftMailerHandler</parameter>
+        <parameter key="monolog.handler.native_mailer.class">Monolog\Handler\NativeMailerHandler</parameter>
         <parameter key="monolog.handler.firephp.class">Symfony\Bundle\MonologBundle\Logger\FirePHPHandler</parameter>
         <parameter key="monolog.handler.debug.class">Symfony\Bundle\MonologBundle\Logger\DebugHandler</parameter>
     </parameters>

+ 2 - 2
src/Symfony/Bundle/MonologBundle/Tests/DependencyInjection/MonologExtensionTest.php

@@ -77,7 +77,7 @@ class MonologExtensionTest extends TestCase
 
         $handler = $container->getDefinition('monolog.handler.main');
         $this->assertDICDefinitionClass($handler, '%monolog.handler.fingers_crossed.class%');
-        $this->assertDICConstructorArguments($handler, array(new Reference('monolog.handler.nested'), \Monolog\Logger::ERROR, 0, false));
+        $this->assertDICConstructorArguments($handler, array(new Reference('monolog.handler.nested'), \Monolog\Logger::ERROR, 0, false, true));
     }
 
     public function testLoadWithOverwriting()
@@ -110,7 +110,7 @@ class MonologExtensionTest extends TestCase
 
         $handler = $container->getDefinition('monolog.handler.main');
         $this->assertDICDefinitionClass($handler, '%monolog.handler.fingers_crossed.class%');
-        $this->assertDICConstructorArguments($handler, array(new Reference('monolog.handler.nested'), \Monolog\Logger::ERROR, 0, false));
+        $this->assertDICConstructorArguments($handler, array(new Reference('monolog.handler.nested'), \Monolog\Logger::ERROR, 0, false, true));
     }
 
     public function testLoadWithNewAtEnd()