Skip to content

Commit

Permalink
Merge pull request #4 from brzuchal/inprove-symfony-bundle-extension
Browse files Browse the repository at this point in the history
Improve Symfony services wiring
  • Loading branch information
brzuchal authored Nov 13, 2023
2 parents 31159e7 + b8b0810 commit 14aeeb5
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 19 deletions.
1 change: 1 addition & 0 deletions phpcs.xml.dist
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,6 @@
<!-- Include full Doctrine Coding Standard -->
<rule ref="Doctrine">
<exclude name="PSR12.Files.OpenTag.NotAlone"/>
<exclude name="SlevomatCodingStandard.Classes.SuperfluousInterfaceNaming.SuperfluousSuffix"/>
</rule>
</ruleset>
2 changes: 0 additions & 2 deletions src/RestClientBuilderInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
55 changes: 48 additions & 7 deletions src/RestClientBundle.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,13 @@
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;
use function sprintf;
use function Symfony\Component\DependencyInjection\Loader\Configurator\param;

/**
Expand All @@ -24,6 +27,7 @@ final class RestClientBundle extends AbstractBundle
public function configure(DefinitionConfigurator $definition): void
{
$clientNode = $definition->rootNode()
->info('REST Client configuration')
->fixXmlConfig('client')
->children()
->arrayNode('clients')
Expand All @@ -33,10 +37,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();
}
Expand All @@ -46,10 +61,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']);
}
}
}
16 changes: 6 additions & 10 deletions tests/RestClientBundleTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace Brzuchal\RestClient\Tests;

use Brzuchal\RestClient\RestClientBuilderInterface;
use Brzuchal\RestClient\RestClientBundle;
use Brzuchal\RestClient\RestClient;
use Brzuchal\RestClient\RestClientInterface;
Expand All @@ -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([
Expand All @@ -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
Expand Down

0 comments on commit 14aeeb5

Please sign in to comment.