[MonologBundle] Changed the way to specify the nested handler to give more flexibility for further handlers

This commit is contained in:
Christophe Coevoet 2011-03-19 17:41:00 +01:00
parent 3d7e68ec1c
commit 32836eac01
3 changed files with 36 additions and 39 deletions

View File

@ -32,9 +32,9 @@ class Configuration
public function getConfigTree()
{
$treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root('monolog', 'array');
$rootNode = $treeBuilder->root('monolog');
$handlersPrototype = $rootNode
$rootNode
->fixXmlConfig('handler')
->children()
->arrayNode('handlers')
@ -43,46 +43,30 @@ class Configuration
->useAttributeAsKey('name')
->prototype('array')
->children()
->scalarNode('type')
->isRequired()
->treatNullLike('null')
->beforeNormalization()
->always()
->then(function($v) { return strtolower($v); })
->end()
->end()
->scalarNode('level')->defaultValue('DEBUG')->end()
->booleanNode('bubble')->defaultFalse()->end()
->scalarNode('path')->end() // stream specific
->scalarNode('action_level')->end() // fingerscrossed specific
->scalarNode('buffer_size')->end() // fingerscrossed specific
->scalarNode('handler')->end() // fingerscrossed specific
->end()
->append($this->getHandlerSubnode())
->validate()
->ifTrue(function($v) { return 'fingerscrossed' === $v['type'] && !isset($v['handler']); })
->thenInvalid('The handler has to be specified to use a FingersCrossedHandler')
->end()
->end()
->end()
->end()
;
$this->addHandlerSection($handlersPrototype);
return $treeBuilder->buildTree();
}
private function addHandlerSection(ArrayNodeDefinition $node)
{
$node
->performNoDeepMerging()
->children()
->scalarNode('type')
->isRequired()
->treatNullLike('null')
->beforeNormalization()
->always()
->then(function($v) { return strtolower($v); })
->end()
->end()
->scalarNode('level')->defaultValue('DEBUG')->end()
->booleanNode('bubble')->defaultFalse()->end()
->scalarNode('path')->end() // stream specific
->end()
;
}
private function getHandlerSubnode()
{
$builder = new TreeBuilder();
$node = $builder->root('handler');
$this->addHandlerSection($node);
return $node;
}
}

View File

@ -27,6 +27,8 @@ use Symfony\Component\DependencyInjection\Parameter;
*/
class MonologExtension extends Extension
{
private $nestedHandlers = array();
/**
* Loads the Monolog configuration.
*
@ -61,14 +63,16 @@ class MonologExtension extends Extension
$handlers = array_reverse($handlers);
foreach ($handlers as $handler) {
$logger->addMethodCall('pushHandler', array(new Reference($handler)));
if (!in_array($handler, $this->nestedHandlers)) {
$logger->addMethodCall('pushHandler', array(new Reference($handler)));
}
}
}
}
public function buildHandler(ContainerBuilder $container, $name, array $handler)
private function buildHandler(ContainerBuilder $container, $name, array $handler)
{
$handlerId = sprintf('monolog.handler.%s', $name);
$handlerId = $this->getHandlerId($name);
$definition = new Definition(sprintf('%%monolog.handler.%s.class%%', $handler['type']));
$handler['level'] = is_int($handler['level']) ? $handler['level'] : constant('Monolog\Logger::'.strtoupper($handler['level']));
@ -90,9 +94,11 @@ class MonologExtension extends Extension
$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);
$definition->setArguments(array(
new Reference($this->buildHandler($container, sprintf('%s.real', $name), $handler['handler'])),
new Reference($nestedHandlerId),
$handler['action_level'],
isset($handler['buffer_size']) ? $handler['buffer_size'] : 0,
$handler['bubble'],
@ -125,4 +131,9 @@ class MonologExtension extends Extension
{
return 'http://symfony.com/schema/dic/monolog';
}
private function getHandlerId($name)
{
return sprintf('monolog.handler.%s', $name);
}
}

View File

@ -62,11 +62,13 @@ class MonologExtensionTest extends TestCase
$loader->load(array(array('handlers' => array(
'custom' => array('type' => 'stream', 'path' => '/tmp/symfony.log', 'bubble' => true, 'level' => 'ERROR'),
'main' => array('type' => 'fingerscrossed', 'action_level' => 'ERROR', 'handler' => array('type' => 'stream'))
'main' => array('type' => 'fingerscrossed', 'action_level' => 'ERROR', 'handler' => 'nested'),
'nested' => array('type' => 'stream')
))), $container);
$this->assertTrue($container->hasDefinition('monolog.logger'));
$this->assertTrue($container->hasDefinition('monolog.handler.custom'));
$this->assertTrue($container->hasDefinition('monolog.handler.main'));
$this->assertTrue($container->hasDefinition('monolog.handler.nested'));
$logger = $container->getDefinition('monolog.logger');
$this->assertDICDefinitionMethodCallAt(1, $logger, 'pushHandler', array(new Reference('monolog.handler.custom')));
@ -78,7 +80,7 @@ class MonologExtensionTest extends TestCase
$handler = $container->getDefinition('monolog.handler.main');
$this->assertDICDefinitionClass($handler, '%monolog.handler.fingerscrossed.class%');
$this->assertDICConstructorArguments($handler, array(new Reference('monolog.handler.main.real'), \Monolog\Logger::ERROR, 0, false));
$this->assertDICConstructorArguments($handler, array(new Reference('monolog.handler.nested'), \Monolog\Logger::ERROR, 0, false));
}
/**