Browse Source

Refactored the configuration class to be DRY

Christophe Coevoet 14 years ago
parent
commit
c4f5a84868
1 changed files with 31 additions and 34 deletions
  1. 31 34
      src/Symfony/Bundle/MonologBundle/DependencyInjection/Configuration.php

+ 31 - 34
src/Symfony/Bundle/MonologBundle/DependencyInjection/Configuration.php

@@ -34,55 +34,52 @@ class Configuration
         $treeBuilder = new TreeBuilder();
         $rootNode = $treeBuilder->root('monolog', 'array');
 
-        $rootNode
+        $handlersPrototype = $rootNode
             ->fixXmlConfig('handler')
             ->arrayNode('handlers')
                 ->canBeUnset()
                 ->performNoDeepMerging()
                 ->useAttributeAsKey('name')
                 ->prototype('array')
-                    ->performNoDeepMerging()
-                    ->scalarNode('type')
-                        ->isRequired()
-                        ->beforeNormalization()
-                            ->always()
-                            ->then(function($v) { return strtolower($v); })
-                        ->end()
-                    ->end()
-                    ->scalarNode('level')->defaultValue('INFO')->end()
-                    ->booleanNode('bubble')->defaultFalse()->end()
-                    ->scalarNode('path')->end() // stream specific
                     ->scalarNode('action_level')->end() // fingerscrossed specific
                     ->scalarNode('buffer_size')->end() // fingerscrossed specific
-                    ->arrayNode('handler')
-                        ->performNoDeepMerging()
-                        ->scalarNode('type')
-                            ->isRequired()
-                            ->beforeNormalization()
-                                ->always()
-                                ->then(function($v) { return strtolower($v); })
-                            ->end()
-                        ->end()
-                        ->scalarNode('level')->defaultValue('DEBUG')->end()
-                        ->booleanNode('bubble')->defaultFalse()->end()
-                        ->scalarNode('path')->end() // stream specific
-                        ->validate()
-                            ->ifTrue(function($v) { return 'stream' === $v['type'] && !isset($v['path']); })
-                            ->thenInvalid('The path has to be specified to use a StreamHandler')
-                        ->end()
-                    ->end()
+                    ->builder($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()
-                    ->validate()
-                        ->ifTrue(function($v) { return 'stream' === $v['type'] && !isset($v['path']); })
-                        ->thenInvalid('The path has to be specified to use a StreamHandler')
-                    ->end()
+        ;
+        $this->addHandlerSection($handlersPrototype);
+
+        return $treeBuilder->buildTree();
+    }
+
+    private function addHandlerSection(NodeBuilder $node)
+    {
+        $node
+            ->performNoDeepMerging()
+            ->scalarNode('type')
+                ->isRequired()
+                ->beforeNormalization()
+                    ->always()
+                    ->then(function($v) { return strtolower($v); })
                 ->end()
             ->end()
+            ->scalarNode('level')->defaultValue('DEBUG')->end()
+            ->booleanNode('bubble')->defaultFalse()->end()
+            ->scalarNode('path')->end() // stream specific
+            ->validate()
+                ->ifTrue(function($v) { return 'stream' === $v['type'] && !isset($v['path']); })
+                ->thenInvalid('The path has to be specified to use a StreamHandler')
+            ->end()
         ;
+    }
 
-        return $treeBuilder->buildTree();
+    private function getHandlerSubnode()
+    {
+        $node = new NodeBuilder('handler', 'array');
+        $this->addHandlerSection($node);
+
+        return $node;
     }
 }