Skip to content

Commit

Permalink
Merge pull request #321 from inverse/v2-wireup
Browse files Browse the repository at this point in the history
Supporting v2 handlers and removing removed.
  • Loading branch information
fabpot committed Nov 13, 2019
2 parents 6792805 + 79cc3ff commit 89998b5
Show file tree
Hide file tree
Showing 2 changed files with 97 additions and 0 deletions.
34 changes: 34 additions & 0 deletions DependencyInjection/MonologExtension.php
Expand Up @@ -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);
Expand Down Expand Up @@ -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));
}

Expand Down
63 changes: 63 additions & 0 deletions Tests/DependencyInjection/MonologExtensionTest.php
Expand Up @@ -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;
Expand Down Expand Up @@ -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();
Expand Down

0 comments on commit 89998b5

Please sign in to comment.