diff --git a/DependencyInjection/MonologExtension.php b/DependencyInjection/MonologExtension.php index 519ace01..f091916b 100644 --- a/DependencyInjection/MonologExtension.php +++ b/DependencyInjection/MonologExtension.php @@ -467,6 +467,7 @@ private function buildHandler(ContainerBuilder $container, $name, array $handler case 'group': case 'whatfailuregroup': + case 'fallbackgroup': $references = []; foreach ($handler['members'] as $nestedHandler) { $nestedHandlerId = $this->getHandlerId($nestedHandler); @@ -938,7 +939,40 @@ private function getHandlerClassByType($handlerType) 'insightops' => 'Monolog\Handler\InsightOpsHandler', ]; + $v2HandlerTypesAdded = [ + 'elasticsearch' => 'Monolog\Handler\ElasticaHandler', + 'fallbackgroup' => 'Monolog\Handler\FallbackGroupHandler', + 'logmatic' => 'Monolog\Handler\LogmaticHandler', + 'noop' => 'Monolog\Handler\NoopHandler', + 'overflow' => 'Monolog\Handler\OverflowHandler', + 'process' => 'Monolog\Handler\ProcessHandler', + 'sendgrid' => 'Monolog\Handler\SendGridHandler', + 'sqs' => 'Monolog\Handler\SqsHandler', + 'telegram' => 'Monolog\Handler\TelegramBotHandler', + ]; + + $v2HandlerTypesRemoved = [ + 'hipchat', + 'raven', + 'slackbot', + ]; + + if (Logger::API === 2) { + $typeToClassMapping = array_merge($typeToClassMapping, $v2HandlerTypesAdded); + foreach($v2HandlerTypesRemoved as $v2HandlerTypeRemoved) { + unset($typeToClassMapping[$v2HandlerTypeRemoved]); + } + } + if (!isset($typeToClassMapping[$handlerType])) { + if (Logger::API === 1 && array_key_exists($handlerType, $v2HandlerTypesAdded)) { + throw new \InvalidArgumentException(sprintf('"%s" was added in Monolog v2, please upgrade if you wish to use it.', $handlerType)); + } + + if (Logger::API === 2 && array_key_exists($handlerType, $v2HandlerTypesRemoved)) { + throw new \InvalidArgumentException(sprintf('"%s" was removed in Monolog v2.', $handlerType)); + } + throw new \InvalidArgumentException(sprintf('There is no handler class defined for handler "%s".', $handlerType)); } diff --git a/Tests/DependencyInjection/MonologExtensionTest.php b/Tests/DependencyInjection/MonologExtensionTest.php index 41f31b4f..398e7fc6 100644 --- a/Tests/DependencyInjection/MonologExtensionTest.php +++ b/Tests/DependencyInjection/MonologExtensionTest.php @@ -11,6 +11,8 @@ namespace Symfony\Bundle\MonologBundle\Tests\DependencyInjection; +use InvalidArgumentException; +use Monolog\Logger; use Symfony\Bundle\MonologBundle\DependencyInjection\MonologExtension; use Symfony\Bundle\MonologBundle\DependencyInjection\Compiler\LoggerChannelPass; use Symfony\Component\DependencyInjection\ContainerBuilder; @@ -532,6 +534,67 @@ public function testFingersCrossedHandlerWhenExcludedHttpCodesAreSpecified() $this->assertDICConstructorArguments($handler, [new Reference('monolog.handler.nested'), new Reference('monolog.handler.main.http_code_strategy'), 0, true, true, null]); } + /** + * @param string $handlerType + * @dataProvider v2RemovedDataProvider + */ + public function testV2Removed($handlerType) + { + if (Logger::API === 1) { + $this->markTestSkipped('Not valid for V1'); + + return; + } + + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage(sprintf('"%s" was removed in Monolog v2.', $handlerType)); + + $container = new ContainerBuilder(); + $loader = new MonologExtension(); + + $loader->load([['handlers' => ['main' => ['type' => $handlerType]]]], $container); + } + + public function v2RemovedDataProvider() + { + return [ + ['hipchat'], + ['raven'], + ['slackbot'], + ]; + } + + /** + * @param string $handlerType + * @dataProvider v1AddedDataProvider + */ + public function testV2AddedOnV1($handlerType) + { + if (Logger::API === 2) { + $this->markTestSkipped('Not valid for V2'); + + return; + } + + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage( + sprintf('"%s" was added in Monolog v2, please upgrade if you wish to use it.', $handlerType) + ); + + $container = new ContainerBuilder(); + $loader = new MonologExtension(); + + $loader->load([['handlers' => ['main' => ['type' => $handlerType]]]], $container); + } + + public function v1AddedDataProvider() + { + return [ + ['fallbackgroup'], + ]; + } + + protected function getContainer(array $config = [], array $thirdPartyDefinitions = []) { $container = new ContainerBuilder();