From eab8ffc5ef910080c702ddc58d5afec0d4ea9687 Mon Sep 17 00:00:00 2001 From: Christophe Coevoet Date: Sat, 7 May 2011 17:54:14 +0200 Subject: [PATCH 1/3] [MonologBundle] Added a proper exception when the handler type is invalid --- .../DependencyInjection/MonologExtension.php | 9 +++++++-- .../DependencyInjection/MonologExtensionTest.php | 11 +++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Bundle/MonologBundle/DependencyInjection/MonologExtension.php b/src/Symfony/Bundle/MonologBundle/DependencyInjection/MonologExtension.php index 8e1cdff9b7..9ed04d2245 100644 --- a/src/Symfony/Bundle/MonologBundle/DependencyInjection/MonologExtension.php +++ b/src/Symfony/Bundle/MonologBundle/DependencyInjection/MonologExtension.php @@ -188,13 +188,18 @@ class MonologExtension extends Extension )); break; - default: - // Handler using the constructor of AbstractHandler without adding their own arguments + // 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'])) { diff --git a/src/Symfony/Bundle/MonologBundle/Tests/DependencyInjection/MonologExtensionTest.php b/src/Symfony/Bundle/MonologBundle/Tests/DependencyInjection/MonologExtensionTest.php index 1cecce1378..5135dbf7ff 100644 --- a/src/Symfony/Bundle/MonologBundle/Tests/DependencyInjection/MonologExtensionTest.php +++ b/src/Symfony/Bundle/MonologBundle/Tests/DependencyInjection/MonologExtensionTest.php @@ -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 */ From a4a40f57cdbbd3ee753b637369a5b61b9ebb5411 Mon Sep 17 00:00:00 2001 From: Christophe Coevoet Date: Sun, 8 May 2011 19:52:38 +0200 Subject: [PATCH 2/3] [MonologBundle] Moved default values to the Configuration class --- .../DependencyInjection/Configuration.php | 12 +++++----- .../DependencyInjection/MonologExtension.php | 24 +++---------------- 2 files changed, 9 insertions(+), 27 deletions(-) diff --git a/src/Symfony/Bundle/MonologBundle/DependencyInjection/Configuration.php b/src/Symfony/Bundle/MonologBundle/DependencyInjection/Configuration.php index a6c76a77a2..b44fa11948 100644 --- a/src/Symfony/Bundle/MonologBundle/DependencyInjection/Configuration.php +++ b/src/Symfony/Bundle/MonologBundle/DependencyInjection/Configuration.php @@ -57,12 +57,12 @@ 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 + ->scalarNode('buffer_size')->defaultValue(0)->end() // fingers_crossed and buffer ->scalarNode('handler')->end() // fingers_crossed and buffer ->scalarNode('formatter')->end() ->end() diff --git a/src/Symfony/Bundle/MonologBundle/DependencyInjection/MonologExtension.php b/src/Symfony/Bundle/MonologBundle/DependencyInjection/MonologExtension.php index 9ed04d2245..7df5649ccc 100644 --- a/src/Symfony/Bundle/MonologBundle/DependencyInjection/MonologExtension.php +++ b/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,7 +144,7 @@ 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'], )); break; @@ -166,20 +155,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'], From d8e6ab7f7afeabf0f8078cae1f48f8989adaf36b Mon Sep 17 00:00:00 2001 From: Christophe Coevoet Date: Sun, 8 May 2011 21:07:00 +0200 Subject: [PATCH 3/3] [MonologBundle] Added the support of SwiftMailerHandler and NativeMailerHandler --- .../DependencyInjection/Configuration.php | 13 ++++++ .../DependencyInjection/MonologExtension.php | 46 +++++++++++++++++-- .../Resources/config/monolog.xml | 2 + .../MonologExtensionTest.php | 4 +- 4 files changed, 59 insertions(+), 6 deletions(-) diff --git a/src/Symfony/Bundle/MonologBundle/DependencyInjection/Configuration.php b/src/Symfony/Bundle/MonologBundle/DependencyInjection/Configuration.php index b44fa11948..f3c8698dbf 100644 --- a/src/Symfony/Bundle/MonologBundle/DependencyInjection/Configuration.php +++ b/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') diff --git a/src/Symfony/Bundle/MonologBundle/DependencyInjection/MonologExtension.php b/src/Symfony/Bundle/MonologBundle/DependencyInjection/MonologExtension.php index 7df5649ccc..09bf0ca52d 100644 --- a/src/Symfony/Bundle/MonologBundle/DependencyInjection/MonologExtension.php +++ b/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; + } } diff --git a/src/Symfony/Bundle/MonologBundle/Resources/config/monolog.xml b/src/Symfony/Bundle/MonologBundle/Resources/config/monolog.xml index 28e9df73da..b32bcfd219 100644 --- a/src/Symfony/Bundle/MonologBundle/Resources/config/monolog.xml +++ b/src/Symfony/Bundle/MonologBundle/Resources/config/monolog.xml @@ -13,6 +13,8 @@ Monolog\Handler\SyslogHandler Monolog\Handler\NullHandler Monolog\Handler\TestHandler + Monolog\Handler\SwiftMailerHandler + Monolog\Handler\NativeMailerHandler Symfony\Bundle\MonologBundle\Logger\FirePHPHandler Symfony\Bundle\MonologBundle\Logger\DebugHandler diff --git a/src/Symfony/Bundle/MonologBundle/Tests/DependencyInjection/MonologExtensionTest.php b/src/Symfony/Bundle/MonologBundle/Tests/DependencyInjection/MonologExtensionTest.php index 5135dbf7ff..b48dc8dd9e 100644 --- a/src/Symfony/Bundle/MonologBundle/Tests/DependencyInjection/MonologExtensionTest.php +++ b/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()