[MonologBundle] Changed the way to specify the nested handler to give more flexibility for further handlers
This commit is contained in:
parent
3d7e68ec1c
commit
32836eac01
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user