Fabien Potencier 14 éve
szülő
commit
5d55b231bb

+ 19 - 6
src/Symfony/Bundle/MonologBundle/DependencyInjection/Configuration.php

@@ -57,13 +57,18 @@ class Configuration implements ConfigurationInterface
                             ->scalarNode('priority')->defaultValue(0)->end()
                             ->scalarNode('level')->defaultValue('DEBUG')->end()
                             ->booleanNode('bubble')->defaultFalse()->end()
-                            ->scalarNode('path')->end() // stream and rotating
-                            ->scalarNode('ident')->end() // syslog
-                            ->scalarNode('facility')->end() // syslog
-                            ->scalarNode('max_files')->end() // rotating
-                            ->scalarNode('action_level')->end() // fingers_crossed
-                            ->scalarNode('buffer_size')->end() // fingers_crossed and buffer
+                            ->scalarNode('path')->defaultValue('%kernel.logs_dir%/%kernel.environment%.log')->end() // stream and rotating
+                            ->scalarNode('ident')->defaultFalse()->end() // syslog
+                            ->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')

+ 52 - 27
src/Symfony/Bundle/MonologBundle/DependencyInjection/MonologExtension.php

@@ -112,10 +112,6 @@ class MonologExtension extends Extension
             return $handlerId;
 
         case 'stream':
-            if (!isset($handler['path'])) {
-                $handler['path'] = '%kernel.logs_dir%/%kernel.environment%.log';
-            }
-
             $definition->setArguments(array(
                 $handler['path'],
                 $handler['level'],
@@ -132,22 +128,15 @@ class MonologExtension extends Extension
             break;
 
         case 'rotating_file':
-            if (!isset($handler['path'])) {
-                $handler['path'] = '%kernel.logs_dir%/%kernel.environment%.log';
-            }
-
             $definition->setArguments(array(
                 $handler['path'],
-                isset($handler['max_files']) ? $handler['max_files'] : 0,
+                $handler['max_files'],
                 $handler['level'],
                 $handler['bubble'],
             ));
             break;
 
         case 'fingers_crossed':
-            if (!isset($handler['action_level'])) {
-                $handler['action_level'] = 'WARNING';
-            }
             $handler['action_level'] = is_int($handler['action_level']) ? $handler['action_level'] : constant('Monolog\Logger::'.strtoupper($handler['action_level']));
             $nestedHandlerId = $this->getHandlerId($handler['handler']);
             array_push($this->nestedHandlers, $nestedHandlerId);
@@ -155,8 +144,9 @@ class MonologExtension extends Extension
             $definition->setArguments(array(
                 new Reference($nestedHandlerId),
                 $handler['action_level'],
-                isset($handler['buffer_size']) ? $handler['buffer_size'] : 0,
+                $handler['buffer_size'],
                 $handler['bubble'],
+                $handler['stop_buffering'],
             ));
             break;
 
@@ -166,20 +156,13 @@ class MonologExtension extends Extension
 
             $definition->setArguments(array(
                 new Reference($nestedHandlerId),
-                isset($handler['buffer_size']) ? $handler['buffer_size'] : 0,
+                $handler['buffer_size'],
                 $handler['level'],
                 $handler['bubble'],
             ));
             break;
 
         case 'syslog':
-            if (!isset($handler['ident'])) {
-                $handler['ident'] = false;
-            }
-            if (!isset($handler['facility'])) {
-                $handler['facility'] = 'user';
-            }
-
             $definition->setArguments(array(
                 $handler['ident'],
                 $handler['facility'],
@@ -188,13 +171,49 @@ class MonologExtension extends Extension
             ));
             break;
 
-        default:
-            // Handler using the constructor of AbstractHandler without adding their own arguments
+        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':
+        case 'debug':
             $definition->setArguments(array(
                 $handler['level'],
                 $handler['bubble'],
             ));
             break;
+
+        default:
+            throw new \InvalidArgumentException(sprintf('Invalid handler type "%s" given for handler "%s"', $handler['type'], $name));
         }
 
         if (!empty($handler['formatter'])) {
@@ -216,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

@@ -15,6 +15,8 @@
         <parameter key="monolog.handler.test.class">Monolog\Handler\TestHandler</parameter>
         <parameter key="monolog.handler.firephp.class">Symfony\Bridge\Monolog\Handler\FirePHPHandler</parameter>
         <parameter key="monolog.handler.debug.class">Symfony\Bridge\Monolog\Handler\DebugHandler</parameter>
+        <parameter key="monolog.handler.swift_mailer.class">Monolog\Handler\SwiftMailerHandler</parameter>
+        <parameter key="monolog.handler.native_mailer.class">Monolog\Handler\NativeMailerHandler</parameter>
     </parameters>
 
     <services>

+ 13 - 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()
@@ -188,6 +188,17 @@ class MonologExtensionTest extends TestCase
         $this->assertDICConstructorArguments($handler, array('/tmp/last.log', \Monolog\Logger::ERROR, true));
     }
 
+    /**
+     * @expectedException InvalidArgumentException
+     */
+    public function testExceptionWhenInvalidHandler()
+    {
+        $container = new ContainerBuilder();
+        $loader = new MonologExtension();
+
+        $loader->load(array(array('handlers' => array('main' => array('type' => 'invalid_handler')))), $container);
+    }
+
     /**
      * @expectedException Symfony\Component\Config\Definition\Exception\InvalidConfigurationException
      */