diff --git a/src/Symfony/Bundle/MonologBundle/DependencyInjection/Configuration.php b/src/Symfony/Bundle/MonologBundle/DependencyInjection/Configuration.php index d7b61f8096..4c56bf981d 100644 --- a/src/Symfony/Bundle/MonologBundle/DependencyInjection/Configuration.php +++ b/src/Symfony/Bundle/MonologBundle/DependencyInjection/Configuration.php @@ -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; - } } diff --git a/src/Symfony/Bundle/MonologBundle/DependencyInjection/MonologExtension.php b/src/Symfony/Bundle/MonologBundle/DependencyInjection/MonologExtension.php index 3bc1c5db8d..a78b3f3fa7 100644 --- a/src/Symfony/Bundle/MonologBundle/DependencyInjection/MonologExtension.php +++ b/src/Symfony/Bundle/MonologBundle/DependencyInjection/MonologExtension.php @@ -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); + } } diff --git a/src/Symfony/Bundle/MonologBundle/Tests/DependencyInjection/MonologExtensionTest.php b/src/Symfony/Bundle/MonologBundle/Tests/DependencyInjection/MonologExtensionTest.php index 92c5193aeb..705a48d19b 100644 --- a/src/Symfony/Bundle/MonologBundle/Tests/DependencyInjection/MonologExtensionTest.php +++ b/src/Symfony/Bundle/MonologBundle/Tests/DependencyInjection/MonologExtensionTest.php @@ -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)); } /**