From 8835c044cc11c159db43179fe198249859f71316 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Brzuchalski?= Date: Mon, 13 Nov 2023 13:56:47 +0100 Subject: [PATCH 1/2] Improve Symfony services wiring --- src/RestClientBuilderInterface.php | 2 -- src/RestClientBundle.php | 54 ++++++++++++++++++++++++++---- tests/RestClientBundleTest.php | 16 ++++----- 3 files changed, 53 insertions(+), 19 deletions(-) diff --git a/src/RestClientBuilderInterface.php b/src/RestClientBuilderInterface.php index 856400a..80c3759 100644 --- a/src/RestClientBuilderInterface.php +++ b/src/RestClientBuilderInterface.php @@ -7,9 +7,7 @@ /** * A mutable builder for creating a {@link RestClientInterface} instances. */ -// phpcs:disable interface RestClientBuilderInterface -// phpcs:enable { /** * Specify a base URI for all requests using the URI template. diff --git a/src/RestClientBundle.php b/src/RestClientBundle.php index d8cdf23..c65f8bc 100644 --- a/src/RestClientBundle.php +++ b/src/RestClientBundle.php @@ -7,7 +7,9 @@ use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; use Symfony\Component\Config\Definition\Configurator\DefinitionConfigurator; use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; +use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\HttpKernel\Bundle\AbstractBundle; use function assert; @@ -24,6 +26,7 @@ final class RestClientBundle extends AbstractBundle public function configure(DefinitionConfigurator $definition): void { $clientNode = $definition->rootNode() + ->info('REST Client configuration') ->fixXmlConfig('client') ->children() ->arrayNode('clients') @@ -33,10 +36,21 @@ public function configure(DefinitionConfigurator $definition): void assert($clientNode instanceof ArrayNodeDefinition); $clientNode + ->fixXmlConfig('accept') ->children() - ->scalarNode('base_uri')->end() - ->scalarNode('accept')->defaultValue('application/json')->end() - ->variableNode('default_headers')->defaultNull()->end() + ->scalarNode('http_client') + ->info('Symfony HttpClient service id, leave to null or skip if one should be created adhoc') + ->end() + ->scalarNode('serializer') + ->info('Symfony Serializer service id, leave to null or skip if one should be created adhoc') + ->end() + ->scalarNode('base_uri') + ->info('The URI to resolve relative URLs, following rules in RFC 3985, section 2.') + ->end() + ->variableNode('default_headers') + ->info('Associative array of default headers: header => value(s).') + ->defaultNull() + ->end() ->end() ->end(); } @@ -46,10 +60,36 @@ public function loadExtension(array $config, ContainerConfigurator $container, C { foreach ($config['clients'] as $name => $values) { $id = 'rest_client.' . $name; - $container->parameters()->set($id . '.base_uri', $values['base_uri']); - $container->services()->set($id, RestClientInterface::class) - ->factory([RestClient::class, 'create']) - ->arg(0, param($id . '.base_uri')); + if ($builder->has($id)) { + throw new InvalidArgumentException(sprintf('Invalid client name: "%s" is reserved.', $id)); + } + + $baseUriParam = $id . '.base_uri'; + $container->parameters()->set($baseUriParam, $values['base_uri']); + $httpClient = !empty($values['http_client']) ? new Reference($values['http_client']) : null; + $serializer = !empty($values['serializer']) ? new Reference($values['serializer']) : null; + $clientService = $container->services()->set($id, RestClientInterface::class); + + $builderId = $id . '.builder'; + $builderService = $container->services()->set($builderId, RestClientBuilderInterface::class); + $builderService->factory([RestClient::class, 'builder']) + ->arg(0, $httpClient) + ->arg(1, $serializer); + + if (!empty($values['base_uri'])) { + $builderService->call('baseUrl', [param($baseUriParam)]); + } + + if (empty($values['default_headers'])) { + $clientService->factory([RestClient::class, 'create']) + ->arg(0, param($baseUriParam)) + ->arg(1, $httpClient) + ->arg(2, $serializer); + continue; + } + + $builderService->call('defaultHeaders', [$values['default_headers']]); + $clientService->factory([new Reference($builderId), 'build']); } } } diff --git a/tests/RestClientBundleTest.php b/tests/RestClientBundleTest.php index 3d8c532..397c024 100644 --- a/tests/RestClientBundleTest.php +++ b/tests/RestClientBundleTest.php @@ -2,6 +2,7 @@ namespace Brzuchal\RestClient\Tests; +use Brzuchal\RestClient\RestClientBuilderInterface; use Brzuchal\RestClient\RestClientBundle; use Brzuchal\RestClient\RestClient; use Brzuchal\RestClient\RestClientInterface; @@ -12,16 +13,6 @@ class RestClientBundleTest extends TestCase { -// public function testRestClientBuilderDefinition(): void -// { -// $container = self::getContainerBuilder(); -// -// $this->assertTrue($container->hasDefinition('rest_client.builder')); -// $definition = $container->getDefinition('rest_client.builder'); -// $this->assertEquals(DefaultRestClientBuilder::class, $definition->getClass()); -// $this->assertEquals([RestClient::class, 'builder'], $definition->getFactory()); -// } - public function testNamedRestClientDefinition(): void { $container = self::getContainerBuilder([ @@ -38,6 +29,11 @@ public function testNamedRestClientDefinition(): void $this->assertEquals(RestClientInterface::class, $definition->getClass()); $this->assertEquals([RestClient::class, 'create'], $definition->getFactory()); $this->assertEquals('%rest_client.test.base_uri%', $definition->getArgument(0)); + + $this->assertTrue($container->hasDefinition('rest_client.test.builder')); + $definition = $container->getDefinition('rest_client.test.builder'); + $this->assertEquals(RestClientBuilderInterface::class, $definition->getClass()); + $this->assertEquals([RestClient::class, 'builder'], $definition->getFactory()); } protected static function getContainerBuilder(array $config = []): ContainerBuilder From b8b081078817ab7b7a438dfa0ec08ca942289093 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Brzuchalski?= Date: Mon, 13 Nov 2023 13:59:34 +0100 Subject: [PATCH 2/2] Align CodeStyle --- phpcs.xml.dist | 1 + src/RestClientBundle.php | 9 +++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/phpcs.xml.dist b/phpcs.xml.dist index 6ad6816..c4ddf5f 100644 --- a/phpcs.xml.dist +++ b/phpcs.xml.dist @@ -19,5 +19,6 @@ + diff --git a/src/RestClientBundle.php b/src/RestClientBundle.php index c65f8bc..e7238a6 100644 --- a/src/RestClientBundle.php +++ b/src/RestClientBundle.php @@ -13,6 +13,7 @@ use Symfony\Component\HttpKernel\Bundle\AbstractBundle; use function assert; +use function sprintf; use function Symfony\Component\DependencyInjection\Loader\Configurator\param; /** @@ -66,17 +67,17 @@ public function loadExtension(array $config, ContainerConfigurator $container, C $baseUriParam = $id . '.base_uri'; $container->parameters()->set($baseUriParam, $values['base_uri']); - $httpClient = !empty($values['http_client']) ? new Reference($values['http_client']) : null; - $serializer = !empty($values['serializer']) ? new Reference($values['serializer']) : null; + $httpClient = ! empty($values['http_client']) ? new Reference($values['http_client']) : null; + $serializer = ! empty($values['serializer']) ? new Reference($values['serializer']) : null; $clientService = $container->services()->set($id, RestClientInterface::class); - $builderId = $id . '.builder'; + $builderId = $id . '.builder'; $builderService = $container->services()->set($builderId, RestClientBuilderInterface::class); $builderService->factory([RestClient::class, 'builder']) ->arg(0, $httpClient) ->arg(1, $serializer); - if (!empty($values['base_uri'])) { + if (! empty($values['base_uri'])) { $builderService->call('baseUrl', [param($baseUriParam)]); }