diff -r 000000000000 -r 7f95f8617b0b vendor/symfony/src/Symfony/Bundle/MonologBundle/DependencyInjection/MonologExtension.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/symfony/src/Symfony/Bundle/MonologBundle/DependencyInjection/MonologExtension.php Sat Sep 24 15:40:41 2011 +0200 @@ -0,0 +1,248 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bundle\MonologBundle\DependencyInjection; + +use Symfony\Component\HttpKernel\DependencyInjection\Extension; +use Symfony\Component\DependencyInjection\Loader\XmlFileLoader; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\Config\FileLocator; +use Symfony\Component\DependencyInjection\Definition; +use Symfony\Component\DependencyInjection\Reference; +use Symfony\Component\DependencyInjection\Parameter; + +/** + * MonologExtension is an extension for the Monolog library. + * + * @author Jordi Boggiano + * @author Christophe Coevoet + */ +class MonologExtension extends Extension +{ + private $nestedHandlers = array(); + + /** + * Loads the Monolog configuration. + * + * @param array $config An array of configuration settings + * @param ContainerBuilder $container A ContainerBuilder instance + */ + public function load(array $configs, ContainerBuilder $container) + { + $configuration = new Configuration(); + $config = $this->processConfiguration($configuration, $configs); + + if (isset($config['handlers'])) { + $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); + $loader->load('monolog.xml'); + $container->setAlias('logger', 'monolog.logger'); + + $logger = $container->getDefinition('monolog.logger_prototype'); + + $handlers = array(); + foreach ($config['handlers'] as $name => $handler) { + $handlers[] = array('id' => $this->buildHandler($container, $name, $handler), 'priority' => $handler['priority'] ); + } + + $handlers = array_reverse($handlers); + uasort($handlers, function($a, $b) { + if ($a['priority'] == $b['priority']) { + return 0; + } + + return $a['priority'] < $b['priority'] ? -1 : 1; + }); + foreach ($handlers as $handler) { + if (!in_array($handler['id'], $this->nestedHandlers)) { + $logger->addMethodCall('pushHandler', array(new Reference($handler['id']))); + } + } + + $this->addClassesToCompile(array( + 'Monolog\\Formatter\\FormatterInterface', + 'Monolog\\Formatter\\LineFormatter', + 'Monolog\\Handler\\HandlerInterface', + 'Monolog\\Handler\\AbstractHandler', + 'Monolog\\Handler\\AbstractProcessingHandler', + 'Monolog\\Handler\\StreamHandler', + 'Monolog\\Handler\\FingersCrossedHandler', + 'Monolog\\Logger', + 'Symfony\\Bridge\\Monolog\\Logger', + 'Symfony\\Bridge\\Monolog\\Handler\\DebugHandler', + )); + } + } + + /** + * Returns the base path for the XSD files. + * + * @return string The XSD base path + */ + public function getXsdValidationBasePath() + { + return __DIR__.'/../Resources/config/schema'; + } + + public function getNamespace() + { + return 'http://symfony.com/schema/dic/monolog'; + } + + private function buildHandler(ContainerBuilder $container, $name, array $handler) + { + $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'])); + + switch ($handler['type']) { + case 'service': + $container->setAlias($handlerId, $handler['id']); + + return $handlerId; + + case 'stream': + $definition->setArguments(array( + $handler['path'], + $handler['level'], + $handler['bubble'], + )); + break; + + case 'firephp': + $definition->setArguments(array( + $handler['level'], + $handler['bubble'], + )); + $definition->addTag('kernel.event_listener', array('event' => 'kernel.response', 'method' => 'onKernelResponse')); + break; + + case 'rotating_file': + $definition->setArguments(array( + $handler['path'], + $handler['max_files'], + $handler['level'], + $handler['bubble'], + )); + break; + + case 'fingers_crossed': + $handler['action_level'] = is_int($handler['action_level']) ? $handler['action_level'] : constant('Monolog\Logger::'.strtoupper($handler['action_level'])); + $nestedHandlerId = $this->getHandlerId($handler['handler']); + $this->nestedHandlers[] = $nestedHandlerId; + + $definition->setArguments(array( + new Reference($nestedHandlerId), + $handler['action_level'], + $handler['buffer_size'], + $handler['bubble'], + $handler['stop_buffering'], + )); + break; + + case 'buffer': + $nestedHandlerId = $this->getHandlerId($handler['handler']); + $this->nestedHandlers[] = $nestedHandlerId; + + $definition->setArguments(array( + new Reference($nestedHandlerId), + $handler['buffer_size'], + $handler['level'], + $handler['bubble'], + )); + break; + + case 'group': + $references = array(); + foreach ($handler['members'] as $nestedHandler) { + $nestedHandlerId = $this->getHandlerId($nestedHandler); + $this->nestedHandlers[] = $nestedHandlerId; + $references[] = new Reference($nestedHandlerId); + } + + $definition->setArguments(array( + $references, + $handler['bubble'], + )); + break; + + case 'syslog': + $definition->setArguments(array( + $handler['ident'], + $handler['facility'], + $handler['level'], + $handler['bubble'], + )); + break; + + case 'swift_mailer': + if (isset($handler['email_prototype'])) { + if (!empty($handler['email_prototype']['method'])) { + $prototype = array(new Reference($handler['email_prototype']['id']), $handler['email_prototype']['method']); + } else { + $prototype = new Reference($handler['email_prototype']['id']); + } + } else { + $message = new Definition('Swift_Message'); + $message->setFactoryService('mailer'); + $message->setFactoryMethod('createMessage'); + $message->setPublic(false); + $message->addMethodCall('setFrom', array($handler['from_email'])); + $message->addMethodCall('setTo', array($handler['to_email'])); + $message->addMethodCall('setSubject', array($handler['subject'])); + $messageId = sprintf('%s.mail_prototype', $handlerId); + $container->setDefinition($messageId, $message); + $prototype = new Reference($messageId); + } + $definition->setArguments(array( + new Reference('mailer'), + $prototype, + $handler['level'], + $handler['bubble'], + )); + break; + + case 'native_mailer': + $definition->setArguments(array( + $handler['to_email'], + $handler['subject'], + $handler['from_email'], + $handler['level'], + $handler['bubble'], + )); + break; + + // Handlers using the constructor of AbstractHandler without adding their own arguments + case 'test': + case 'null': + case 'debug': + $definition->setArguments(array( + $handler['level'], + $handler['bubble'], + )); + break; + + default: + throw new \InvalidArgumentException(sprintf('Invalid handler type "%s" given for handler "%s"', $handler['type'], $name)); + } + + if (!empty($handler['formatter'])) { + $definition->addMethodCall('setFormatter', array(new Reference($handler['formatter']))); + } + $container->setDefinition($handlerId, $definition); + + return $handlerId; + } + + private function getHandlerId($name) + { + return sprintf('monolog.handler.%s', $name); + } +}