diff --git a/CHANGELOG.md b/CHANGELOG.md index 5dd07b0f..5bd7e5f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ The change log describes what is "Added", "Removed", "Changed" or "Fixed" between each release. +## 1.12.0 - 2018-10-24 + +### Added + +- Add configuration option to create public clients + ## 1.11.0 - 2018-07-07 ### Added diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php index 0bc7306e..031fb5b0 100644 --- a/DependencyInjection/Configuration.php +++ b/DependencyInjection/Configuration.php @@ -195,6 +195,10 @@ private function configureClients(ArrayNodeDefinition $root) ->defaultNull() ->info('The service id of the client to use.') ->end() + ->booleanNode('public') + ->defaultNull() + ->info('Set to true if you really cannot use dependency injection and need to make the client service public.') + ->end() ->booleanNode('flexible_client') ->defaultFalse() ->info('Set to true to get the client wrapped in a FlexibleHttpClient which emulates async or sync behavior.') diff --git a/DependencyInjection/HttplugExtension.php b/DependencyInjection/HttplugExtension.php index 93977b1c..d00713d7 100644 --- a/DependencyInjection/HttplugExtension.php +++ b/DependencyInjection/HttplugExtension.php @@ -323,7 +323,7 @@ private function configureClient(ContainerBuilder $container, $clientName, array ->setAlias($serviceId.'.client', new Alias($arguments['service'], false)); } - $container + $definition = $container ->register($serviceId, PluginClient::class) ->setFactory([new Reference(PluginClientFactory::class), 'createClient']) ->addArgument(new Reference($serviceId.'.client')) @@ -340,6 +340,10 @@ function ($id) { ]) ; + if (is_bool($arguments['public'])) { + $definition->setPublic($arguments['public']); + } + /* * Decorate the client with clients from client-common */ @@ -347,7 +351,7 @@ function ($id) { $container ->register($serviceId.'.flexible', FlexibleHttpClient::class) ->addArgument(new Reference($serviceId.'.flexible.inner')) - ->setPublic(false) + ->setPublic($arguments['public'] ? true : false) ->setDecoratedService($serviceId) ; } @@ -356,7 +360,7 @@ function ($id) { $container ->register($serviceId.'.http_methods', HttpMethodsClient::class) ->setArguments([new Reference($serviceId.'.http_methods.inner'), new Reference('httplug.message_factory')]) - ->setPublic(false) + ->setPublic($arguments['public'] ? true : false) ->setDecoratedService($serviceId) ; } @@ -365,7 +369,7 @@ function ($id) { $container ->register($serviceId.'.batch_client', BatchClient::class) ->setArguments([new Reference($serviceId.'.batch_client.inner')]) - ->setPublic(false) + ->setPublic($arguments['public'] ? true : false) ->setDecoratedService($serviceId) ; } diff --git a/Tests/Unit/DependencyInjection/ConfigurationTest.php b/Tests/Unit/DependencyInjection/ConfigurationTest.php index a92b5ab8..7a937ca2 100644 --- a/Tests/Unit/DependencyInjection/ConfigurationTest.php +++ b/Tests/Unit/DependencyInjection/ConfigurationTest.php @@ -119,6 +119,7 @@ public function testSupportsAllConfigFormats() 'factory' => 'httplug.factory.guzzle6', 'http_methods_client' => true, 'service' => null, + 'public' => null, 'flexible_client' => false, 'batch_client' => false, 'plugins' => [ diff --git a/Tests/Unit/DependencyInjection/HttplugExtensionTest.php b/Tests/Unit/DependencyInjection/HttplugExtensionTest.php index 4d32121d..e625addb 100644 --- a/Tests/Unit/DependencyInjection/HttplugExtensionTest.php +++ b/Tests/Unit/DependencyInjection/HttplugExtensionTest.php @@ -6,6 +6,7 @@ use Http\HttplugBundle\DependencyInjection\HttplugExtension; use Matthias\SymfonyDependencyInjectionTest\PhpUnit\AbstractExtensionTestCase; use Symfony\Component\DependencyInjection\Reference; +use Symfony\Component\HttpKernel\Kernel; /** * @author David Buchmann @@ -267,4 +268,145 @@ private function verifyProfilingDisabled() ); } } + + public function testClientShouldHaveDefaultVisibility() + { + $this->load([ + 'clients' => [ + 'acme' => [], + ], + ]); + + $this->assertContainerBuilderHasService('httplug.client.acme'); + + if (version_compare(Kernel::VERSION, '3.4', '>=')) { + // Symfony made services private by default starting from 3.4 + $this->assertTrue($this->container->getDefinition('httplug.client.acme')->isPublic()); + $this->assertTrue($this->container->getDefinition('httplug.client.acme')->isPrivate()); + } else { + // Legacy Symfony + $this->assertTrue($this->container->getDefinition('httplug.client.acme')->isPublic()); + } + } + + public function testFlexibleClientShouldBePrivateByDefault() + { + $this->load([ + 'clients' => [ + 'acme' => [ + 'flexible_client' => true, + ], + ], + ]); + + $this->assertContainerBuilderHasService('httplug.client.acme'); + $this->assertFalse($this->container->getDefinition('httplug.client.acme.flexible')->isPublic()); + } + + public function testHttpMethodsClientShouldBePrivateByDefault() + { + $this->load([ + 'clients' => [ + 'acme' => [ + 'http_methods_client' => true, + ], + ], + ]); + + $this->assertContainerBuilderHasService('httplug.client.acme'); + $this->assertFalse($this->container->getDefinition('httplug.client.acme.http_methods')->isPublic()); + } + + public function testBatchClientShouldBePrivateByDefault() + { + $this->load([ + 'clients' => [ + 'acme' => [ + 'batch_client' => true, + ], + ], + ]); + + $this->assertContainerBuilderHasService('httplug.client.acme'); + $this->assertFalse($this->container->getDefinition('httplug.client.acme.batch_client')->isPublic()); + } + + public function testClientCanBePublic() + { + $this->load([ + 'clients' => [ + 'acme' => [ + 'public' => true, + ], + ], + ]); + + $this->assertContainerBuilderHasService('httplug.client.acme'); + $this->assertTrue($this->container->getDefinition('httplug.client.acme')->isPublic()); + + if (version_compare(Kernel::VERSION, '3.4', '>=')) { + // Symfony made services private by default starting from 3.4 + $this->assertFalse($this->container->getDefinition('httplug.client.acme')->isPrivate()); + } + } + + public function testFlexibleClientCanBePublic() + { + $this->load([ + 'clients' => [ + 'acme' => [ + 'public' => true, + 'flexible_client' => true, + ], + ], + ]); + + $this->assertContainerBuilderHasService('httplug.client.acme'); + $this->assertTrue($this->container->getDefinition('httplug.client.acme.flexible')->isPublic()); + + if (version_compare(Kernel::VERSION, '3.4', '>=')) { + // Symfony made services private by default starting from 3.4 + $this->assertFalse($this->container->getDefinition('httplug.client.acme.flexible')->isPrivate()); + } + } + + public function testHttpMethodsClientCanBePublic() + { + $this->load([ + 'clients' => [ + 'acme' => [ + 'public' => true, + 'http_methods_client' => true, + ], + ], + ]); + + $this->assertContainerBuilderHasService('httplug.client.acme'); + $this->assertTrue($this->container->getDefinition('httplug.client.acme.http_methods')->isPublic()); + + if (version_compare(Kernel::VERSION, '3.4', '>=')) { + // Symfony made services private by default starting from 3.4 + $this->assertFalse($this->container->getDefinition('httplug.client.acme.http_methods')->isPrivate()); + } + } + + public function testBatchClientCanBePublic() + { + $this->load([ + 'clients' => [ + 'acme' => [ + 'public' => true, + 'batch_client' => true, + ], + ], + ]); + + $this->assertContainerBuilderHasService('httplug.client.acme'); + $this->assertTrue($this->container->getDefinition('httplug.client.acme.batch_client')->isPublic()); + + if (version_compare(Kernel::VERSION, '3.4', '>=')) { + // Symfony made services private by default starting from 3.4 + $this->assertFalse($this->container->getDefinition('httplug.client.acme.batch_client')->isPrivate()); + } + } }