From b8d9cc0150abfc44b269513d3c810bd6e6e8cac6 Mon Sep 17 00:00:00 2001 From: natepage Date: Mon, 5 Jul 2021 12:39:15 +1000 Subject: [PATCH] [EasyHttpClient] Add Symfony config to decorate default http client --- .../src/Bridge/BridgeConstantsInterface.php | 5 ++ .../Compiler/DecorateDefaultClientPass.php | 48 +++++++++++++++++++ .../DependencyInjection/Configuration.php | 1 + .../EasyHttpClientExtension.php | 12 +++-- .../Symfony/EasyHttpClientSymfonyBundle.php | 7 +++ 5 files changed, 70 insertions(+), 3 deletions(-) create mode 100644 packages/EasyHttpClient/src/Bridge/Symfony/DependencyInjection/Compiler/DecorateDefaultClientPass.php diff --git a/packages/EasyHttpClient/src/Bridge/BridgeConstantsInterface.php b/packages/EasyHttpClient/src/Bridge/BridgeConstantsInterface.php index c4821edad..ea01c554c 100644 --- a/packages/EasyHttpClient/src/Bridge/BridgeConstantsInterface.php +++ b/packages/EasyHttpClient/src/Bridge/BridgeConstantsInterface.php @@ -10,4 +10,9 @@ interface BridgeConstantsInterface * @var string */ public const LOG_CHANNEL = 'http_client'; + + /** + * @var string + */ + public const PARAM_DECORATE_DEFAULT_CLIENT = 'easy_http_client.decorate_default_client'; } diff --git a/packages/EasyHttpClient/src/Bridge/Symfony/DependencyInjection/Compiler/DecorateDefaultClientPass.php b/packages/EasyHttpClient/src/Bridge/Symfony/DependencyInjection/Compiler/DecorateDefaultClientPass.php new file mode 100644 index 000000000..96e0da9cd --- /dev/null +++ b/packages/EasyHttpClient/src/Bridge/Symfony/DependencyInjection/Compiler/DecorateDefaultClientPass.php @@ -0,0 +1,48 @@ +has(self::DEFAULT_CLIENT_ID) === false) { + return; + } + + // Apply only if configured to do so + if ($this->isEnabled($container) === false) { + return; + } + + $def = (new Definition(WithEventsHttpClient::class)) + ->setAutowired(true) + ->setAutoconfigured(true) + ->setDecoratedService(self::DEFAULT_CLIENT_ID); + + $container->setDefinition(WithEventsHttpClient::class, $def); + } + + private function isEnabled(ContainerBuilder $container): bool + { + if ($container->hasParameter(BridgeConstantsInterface::PARAM_DECORATE_DEFAULT_CLIENT) === false) { + return false; + } + + return (bool)$container->getParameter(BridgeConstantsInterface::PARAM_DECORATE_DEFAULT_CLIENT); + } +} diff --git a/packages/EasyHttpClient/src/Bridge/Symfony/DependencyInjection/Configuration.php b/packages/EasyHttpClient/src/Bridge/Symfony/DependencyInjection/Configuration.php index d8acd6bf8..f29ed51a1 100644 --- a/packages/EasyHttpClient/src/Bridge/Symfony/DependencyInjection/Configuration.php +++ b/packages/EasyHttpClient/src/Bridge/Symfony/DependencyInjection/Configuration.php @@ -15,6 +15,7 @@ public function getConfigTreeBuilder(): TreeBuilder $treeBuilder->getRootNode() ->children() + ->booleanNode('decorate_default_client')->defaultFalse()->end() ->booleanNode('easy_bugsnag_enabled')->defaultTrue()->end() ->booleanNode('psr_logger_enabled')->defaultTrue()->end() ->end(); diff --git a/packages/EasyHttpClient/src/Bridge/Symfony/DependencyInjection/EasyHttpClientExtension.php b/packages/EasyHttpClient/src/Bridge/Symfony/DependencyInjection/EasyHttpClientExtension.php index 2b45e52a9..d5e2d3f8c 100644 --- a/packages/EasyHttpClient/src/Bridge/Symfony/DependencyInjection/EasyHttpClientExtension.php +++ b/packages/EasyHttpClient/src/Bridge/Symfony/DependencyInjection/EasyHttpClientExtension.php @@ -5,6 +5,7 @@ namespace EonX\EasyHttpClient\Bridge\Symfony\DependencyInjection; use Bugsnag\Client; +use EonX\EasyHttpClient\Bridge\BridgeConstantsInterface; use Psr\Log\LoggerInterface; use Symfony\Component\Config\FileLocator; use Symfony\Component\DependencyInjection\ContainerBuilder; @@ -23,9 +24,14 @@ public function load(array $configs, ContainerBuilder $container): void $config = $this->processConfiguration(new Configuration(), $configs); $loader = new PhpFileLoader($container, new FileLocator([__DIR__ . '/../Resources/config'])); - if (($config['easy_bugsnag_enabled'] ?? true) && \class_exists(Client::class)) { - $loader->load('easy_bugsnag.php'); - } + $container->setParameter( + BridgeConstantsInterface::PARAM_DECORATE_DEFAULT_CLIENT, + $config['decorate_default_client'] ?? false + ); + + if (($config['easy_bugsnag_enabled'] ?? true) && \class_exists(Client::class)) { + $loader->load('easy_bugsnag.php'); + } if (($config['psr_logger_enabled'] ?? true) && \interface_exists(LoggerInterface::class)) { $loader->load('psr_logger.php'); diff --git a/packages/EasyHttpClient/src/Bridge/Symfony/EasyHttpClientSymfonyBundle.php b/packages/EasyHttpClient/src/Bridge/Symfony/EasyHttpClientSymfonyBundle.php index 224f3f019..780e8101f 100644 --- a/packages/EasyHttpClient/src/Bridge/Symfony/EasyHttpClientSymfonyBundle.php +++ b/packages/EasyHttpClient/src/Bridge/Symfony/EasyHttpClientSymfonyBundle.php @@ -4,12 +4,19 @@ namespace EonX\EasyHttpClient\Bridge\Symfony; +use EonX\EasyHttpClient\Bridge\Symfony\DependencyInjection\Compiler\DecorateDefaultClientPass; use EonX\EasyHttpClient\Bridge\Symfony\DependencyInjection\EasyHttpClientExtension; +use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Extension\ExtensionInterface; use Symfony\Component\HttpKernel\Bundle\Bundle; final class EasyHttpClientSymfonyBundle extends Bundle { + public function build(ContainerBuilder $container): void + { + $container->addCompilerPass(new DecorateDefaultClientPass()); + } + public function getContainerExtension(): ExtensionInterface { return new EasyHttpClientExtension();