merged monolog

This commit is contained in:
Fabien Potencier 2011-05-09 08:56:30 +02:00
commit 5d55b231bb
4 changed files with 86 additions and 35 deletions

View File

@ -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')

View File

@ -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;
}
}

View File

@ -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>

View File

@ -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
*/