[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()
|
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')
|
||||||
@ -43,46 +43,30 @@ class Configuration
|
|||||||
->useAttributeAsKey('name')
|
->useAttributeAsKey('name')
|
||||||
->prototype('array')
|
->prototype('array')
|
||||||
->children()
|
->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('action_level')->end() // fingerscrossed specific
|
||||||
->scalarNode('buffer_size')->end() // fingerscrossed specific
|
->scalarNode('buffer_size')->end() // fingerscrossed specific
|
||||||
|
->scalarNode('handler')->end() // fingerscrossed specific
|
||||||
->end()
|
->end()
|
||||||
->append($this->getHandlerSubnode())
|
|
||||||
->validate()
|
->validate()
|
||||||
->ifTrue(function($v) { return 'fingerscrossed' === $v['type'] && !isset($v['handler']); })
|
->ifTrue(function($v) { return 'fingerscrossed' === $v['type'] && !isset($v['handler']); })
|
||||||
->thenInvalid('The handler has to be specified to use a FingersCrossedHandler')
|
->thenInvalid('The handler has to be specified to use a FingersCrossedHandler')
|
||||||
->end()
|
->end()
|
||||||
|
->end()
|
||||||
|
->end()
|
||||||
|
->end()
|
||||||
;
|
;
|
||||||
$this->addHandlerSection($handlersPrototype);
|
|
||||||
|
|
||||||
return $treeBuilder->buildTree();
|
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
|
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) {
|
||||||
$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']));
|
$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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user