Source of file MonologExtension.php
Size: 12,437 Bytes - Last Modified: 2013-05-27T20:06:55+02:00
/home/theseer/Downloads/Symfony/vendor/symfony/monolog-bundle/Symfony/Bundle/MonologBundle/DependencyInjection/MonologExtension.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341 | <?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * 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\Config\Definition\Exception\InvalidConfigurationException; /** * MonologExtension is an extension for the Monolog library. * * @author Jordi Boggiano <j.boggiano@seld.be> * @author Christophe Coevoet <stof@notk.org> */ class MonologExtension extends Extension { private $nestedHandlers = array(); /** * Loads the Monolog configuration. * * @param array $configs An array of configuration settings * @param ContainerBuilder $container A ContainerBuilder instance */ public function load(array $configs, ContainerBuilder $container) { $configuration = $this->getConfiguration($configs, $container); $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'); $handlers = array(); foreach ($config['handlers'] as $name => $handler) { $handlers[$handler['priority']][] = array( 'id' => $this->buildHandler($container, $name, $handler), 'channels' => isset($handler['channels']) ? $handler['channels'] : null ); } ksort($handlers); $sortedHandlers = array(); foreach ($handlers as $priorityHandlers) { foreach (array_reverse($priorityHandlers) as $handler) { $sortedHandlers[] = $handler; } } $handlersToChannels = array(); foreach ($sortedHandlers as $handler) { if (!in_array($handler['id'], $this->nestedHandlers)) { $handlersToChannels[$handler['id']] = $handler['channels']; } } $container->setParameter('monolog.handlers_to_channels', $handlersToChannels); $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\\Handler\\TestHandler', 'Monolog\\Logger', 'Symfony\\Bridge\\Monolog\\Logger', 'Symfony\\Bridge\\Monolog\\Handler\\DebugHandler', 'Monolog\\Handler\\FingersCrossed\\ActivationStrategyInterface', 'Monolog\\Handler\\FingersCrossed\\ErrorLevelActivationStrategy', )); } } /** * 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 'gelf': if (isset($handler['publisher']['id'])) { $publisherId = $handler['publisher']['id']; } else { $publisher = new Definition("%monolog.gelf.publisher.class%", array( $handler['publisher']['hostname'], $handler['publisher']['port'], $handler['publisher']['chunk_size'], )); $publisherId = 'monolog.gelf.publisher'; $publisher->setPublic(false); $container->setDefinition($publisherId, $publisher); } $definition->setArguments(array( new Reference($publisherId), $handler['level'], $handler['bubble'], )); break; case 'chromephp': $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; if (isset($handler['activation_strategy'])) { $activation = new Reference($handler['activation_strategy']); } else { $activation = $handler['action_level']; } $definition->setArguments(array( new Reference($nestedHandlerId), $activation, $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'], $handler['logopts'], )); 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'])); if (isset($handler['content_type'])) { $message->addMethodCall('setContentType', array($handler['content_type'])); } $messageId = sprintf('%s.mail_prototype', $handlerId); $container->setDefinition($messageId, $message); $prototype = new Reference($messageId); } $definition->setArguments(array( new Reference($handler['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; case 'socket': $definition->setArguments(array( $handler['connection_string'], $handler['level'], $handler['bubble'], )); if (isset($handler['timeout'])) { $definition->addMethodCall('setTimeout', array($handler['timeout'])); } if (isset($handler['connection_timeout'])) { $definition->addMethodCall('setConnectionTimeout', array($handler['connection_timeout'])); } if (isset($handler['persistent'])) { $definition->addMethodCall('setPersistent', array($handler['persistent'])); } break; case 'pushover': $definition->setArguments(array( $handler['token'], $handler['user'], $handler['title'], $handler['level'], $handler['bubble'], )); break; case 'raven': $clientId = 'monolog.raven.client.' . sha1($handler['dsn']); if (!$container->hasDefinition($clientId)) { $client = new Definition("Raven_Client", array( $handler['dsn'] )); $client->setPublic(false); $container->setDefinition($clientId, $client); } $definition->setArguments(array( new Reference($clientId), $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); } } |