[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() public function getConfigTree()
{ {
$treeBuilder = new TreeBuilder(); $treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root('monolog', 'array'); $rootNode = $treeBuilder->root('monolog');
$handlersPrototype = $rootNode $rootNode
->fixXmlConfig('handler') ->fixXmlConfig('handler')
->children() ->children()
->arrayNode('handlers') ->arrayNode('handlers')
@ -42,25 +42,6 @@ class Configuration
->performNoDeepMerging() ->performNoDeepMerging()
->useAttributeAsKey('name') ->useAttributeAsKey('name')
->prototype('array') ->prototype('array')
->children()
->scalarNode('action_level')->end() // fingerscrossed specific
->scalarNode('buffer_size')->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()
;
$this->addHandlerSection($handlersPrototype);
return $treeBuilder->buildTree();
}
private function addHandlerSection(ArrayNodeDefinition $node)
{
$node
->performNoDeepMerging()
->children() ->children()
->scalarNode('type') ->scalarNode('type')
->isRequired() ->isRequired()
@ -73,16 +54,19 @@ class Configuration
->scalarNode('level')->defaultValue('DEBUG')->end() ->scalarNode('level')->defaultValue('DEBUG')->end()
->booleanNode('bubble')->defaultFalse()->end() ->booleanNode('bubble')->defaultFalse()->end()
->scalarNode('path')->end() // stream specific ->scalarNode('path')->end() // stream specific
->scalarNode('action_level')->end() // fingerscrossed specific
->scalarNode('buffer_size')->end() // fingerscrossed specific
->scalarNode('handler')->end() // fingerscrossed specific
->end()
->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() ->end()
; ;
}
private function getHandlerSubnode() return $treeBuilder->buildTree();
{
$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 class MonologExtension extends Extension
{ {
private $nestedHandlers = array();
/** /**
* Loads the Monolog configuration. * Loads the Monolog configuration.
* *
@ -61,14 +63,16 @@ class MonologExtension extends Extension
$handlers = array_reverse($handlers); $handlers = array_reverse($handlers);
foreach ($handlers as $handler) { foreach ($handlers as $handler) {
if (!in_array($handler, $this->nestedHandlers)) {
$logger->addMethodCall('pushHandler', array(new Reference($handler))); $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'])); $definition = new Definition(sprintf('%%monolog.handler.%s.class%%', $handler['type']));
$handler['level'] = is_int($handler['level']) ? $handler['level'] : constant('Monolog\Logger::'.strtoupper($handler['level'])); $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'] = 'WARNING';
} }
$handler['action_level'] = is_int($handler['action_level']) ? $handler['action_level'] : constant('Monolog\Logger::'.strtoupper($handler['action_level'])); $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( $definition->setArguments(array(
new Reference($this->buildHandler($container, sprintf('%s.real', $name), $handler['handler'])), new Reference($nestedHandlerId),
$handler['action_level'], $handler['action_level'],
isset($handler['buffer_size']) ? $handler['buffer_size'] : 0, isset($handler['buffer_size']) ? $handler['buffer_size'] : 0,
$handler['bubble'], $handler['bubble'],
@ -125,4 +131,9 @@ class MonologExtension extends Extension
{ {
return 'http://symfony.com/schema/dic/monolog'; 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( $loader->load(array(array('handlers' => array(
'custom' => array('type' => 'stream', 'path' => '/tmp/symfony.log', 'bubble' => true, 'level' => 'ERROR'), '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); ))), $container);
$this->assertTrue($container->hasDefinition('monolog.logger')); $this->assertTrue($container->hasDefinition('monolog.logger'));
$this->assertTrue($container->hasDefinition('monolog.handler.custom')); $this->assertTrue($container->hasDefinition('monolog.handler.custom'));
$this->assertTrue($container->hasDefinition('monolog.handler.main')); $this->assertTrue($container->hasDefinition('monolog.handler.main'));
$this->assertTrue($container->hasDefinition('monolog.handler.nested'));
$logger = $container->getDefinition('monolog.logger'); $logger = $container->getDefinition('monolog.logger');
$this->assertDICDefinitionMethodCallAt(1, $logger, 'pushHandler', array(new Reference('monolog.handler.custom'))); $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'); $handler = $container->getDefinition('monolog.handler.main');
$this->assertDICDefinitionClass($handler, '%monolog.handler.fingerscrossed.class%'); $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));
} }
/** /**