Browse Source

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

Christophe Coevoet 14 năm trước cách đây
mục cha
commit
32836eac01

+ 15 - 31
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()
-        ;
-        $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;
+        return $treeBuilder->buildTree();
     }
 }

+ 15 - 4
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);
+    }
 }

+ 4 - 2
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));
     }
 
     /**