Skip to content

Commit aabe16e

Browse files
Merge branch '7.4' into 8.0
* 7.4: Fix the initialization of the phpunit bridge [FrameworkBundle] Simplify wiring of scoped clients Bump Symfony version to 7.3.6 Update VERSION for 7.3.5 Update CHANGELOG for 7.3.5 Bump Symfony version to 6.4.28 Update VERSION for 6.4.27 Update CONTRIBUTORS for 6.4.27 Update CHANGELOG for 6.4.27
2 parents 9ebde41 + 34005d9 commit aabe16e

File tree

2 files changed

+52
-47
lines changed

2 files changed

+52
-47
lines changed

DependencyInjection/FrameworkExtension.php

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2735,47 +2735,52 @@ private function registerHttpClientConfiguration(array $config, ContainerBuilder
27352735
$retryOptions = $scopeConfig['retry_failed'] ?? ['enabled' => false];
27362736
unset($scopeConfig['retry_failed']);
27372737

2738-
$transport = $name.'.transport';
2739-
$container->register($transport, HttpClientInterface::class)
2738+
// This "transport" service is decorated in the following order:
2739+
// 1. ThrottlingHttpClient (30) -> throttles requests
2740+
// 2. UriTemplateHttpClient (25) -> expands URI templates
2741+
// 3. ScopingHttpClient (20) -> resolves relative URLs and applies scope configuration
2742+
// 4. CachingHttpClient (15) -> caches responses
2743+
// 5. RetryableHttpClient (10) -> retries requests
2744+
// 6. TraceableHttpClient (5) -> traces requests
2745+
$container->register($name, HttpClientInterface::class)
27402746
->setFactory('current')
27412747
->setArguments([[new Reference('http_client.transport')]])
2748+
->addTag('http_client.client')
27422749
;
27432750

2751+
$scopingDefinition = $container->register($name.'.scoping', ScopingHttpClient::class)
2752+
->setDecoratedService($name, null, 20)
2753+
->addTag('kernel.reset', ['method' => 'reset', 'on_invalid' => 'ignore']);
2754+
27442755
if (null === $scope) {
27452756
$baseUri = $scopeConfig['base_uri'];
27462757
unset($scopeConfig['base_uri']);
27472758

2748-
$container->register($name, ScopingHttpClient::class)
2759+
$scopingDefinition
27492760
->setFactory([ScopingHttpClient::class, 'forBaseUri'])
2750-
->setArguments([new Reference($transport), $baseUri, $scopeConfig])
2751-
->addTag('http_client.client')
2752-
->addTag('kernel.reset', ['method' => 'reset', 'on_invalid' => 'ignore'])
2753-
;
2761+
->setArguments([new Reference('.inner'), $baseUri, $scopeConfig]);
27542762
} else {
2755-
$container->register($name, ScopingHttpClient::class)
2756-
->setArguments([new Reference($transport), [$scope => $scopeConfig], $scope])
2757-
->addTag('http_client.client')
2758-
->addTag('kernel.reset', ['method' => 'reset', 'on_invalid' => 'ignore'])
2759-
;
2763+
$scopingDefinition
2764+
->setArguments([new Reference('.inner'), [$scope => $scopeConfig], $scope]);
27602765
}
27612766

27622767
if ($this->readConfigEnabled('http_client.scoped_clients.'.$name.'.caching', $container, $cachingOptions)) {
2763-
$this->registerCachingHttpClient($cachingOptions, $scopeConfig, $transport, $container);
2768+
$this->registerCachingHttpClient($cachingOptions, $scopeConfig, $name, $container);
27642769
}
27652770

27662771
if (null !== $rateLimiter) {
2767-
$this->registerThrottlingHttpClient($rateLimiter, $transport, $container);
2772+
$this->registerThrottlingHttpClient($rateLimiter, $name, $container);
27682773
}
27692774

27702775
if ($this->readConfigEnabled('http_client.scoped_clients.'.$name.'.retry_failed', $container, $retryOptions)) {
2771-
$this->registerRetryableHttpClient($retryOptions, $transport, $container);
2776+
$this->registerRetryableHttpClient($retryOptions, $name, $container);
27722777
}
27732778

27742779
$container
27752780
->register($name.'.uri_template', UriTemplateHttpClient::class)
2776-
->setDecoratedService($name, null, 7) // After TraceableHttpClient (5) and on top of ScopingHttpClient
2781+
->setDecoratedService($name, null, 25)
27772782
->setArguments([
2778-
new Reference($name.'.uri_template.inner'),
2783+
new Reference('.inner'),
27792784
new Reference('http_client.uri_template_expander', ContainerInterface::NULL_ON_INVALID_REFERENCE),
27802785
$defaultUriTemplateVars,
27812786
]);
@@ -2799,7 +2804,7 @@ private function registerHttpClientConfiguration(array $config, ContainerBuilder
27992804

28002805
if ($responseFactoryId = $config['mock_response_factory'] ?? null) {
28012806
$container->register('http_client.mock_client', MockHttpClient::class)
2802-
->setDecoratedService('http_client.transport', null, -10) // lower priority than TraceableHttpClient (5)
2807+
->setDecoratedService('http_client.transport', null, -10)
28032808
->setArguments([new Reference($responseFactoryId)]);
28042809
}
28052810
}
@@ -2812,9 +2817,9 @@ private function registerCachingHttpClient(array $options, array $defaultOptions
28122817

28132818
$container
28142819
->register($name.'.caching', CachingHttpClient::class)
2815-
->setDecoratedService($name, null, 13) // between RetryableHttpClient (10) and ThrottlingHttpClient (15)
2820+
->setDecoratedService($name, null, 15)
28162821
->setArguments([
2817-
new Reference($name.'.caching.inner'),
2822+
new Reference('.inner'),
28182823
new Reference($options['cache_pool']),
28192824
$defaultOptions,
28202825
$options['shared'],
@@ -2833,8 +2838,8 @@ private function registerThrottlingHttpClient(string $rateLimiter, string $name,
28332838

28342839
$container
28352840
->register($name.'.throttling', ThrottlingHttpClient::class)
2836-
->setDecoratedService($name, null, 15) // higher priority than RetryableHttpClient (10)
2837-
->setArguments([new Reference($name.'.throttling.inner'), new Reference($name.'.throttling.limiter')]);
2841+
->setDecoratedService($name, null, 30)
2842+
->setArguments([new Reference('.inner'), new Reference($name.'.throttling.limiter')]);
28382843
}
28392844

28402845
private function registerRetryableHttpClient(array $options, string $name, ContainerBuilder $container): void
@@ -2865,8 +2870,8 @@ private function registerRetryableHttpClient(array $options, string $name, Conta
28652870

28662871
$container
28672872
->register($name.'.retryable', RetryableHttpClient::class)
2868-
->setDecoratedService($name, null, 10) // higher priority than TraceableHttpClient (5)
2869-
->setArguments([new Reference($name.'.retryable.inner'), $retryStrategy, $options['max_retries'], new Reference('logger')])
2873+
->setDecoratedService($name, null, 10)
2874+
->setArguments([new Reference('.inner'), $retryStrategy, $options['max_retries'], new Reference('logger')])
28702875
->addTag('monolog.logger', ['channel' => 'http_client']);
28712876
}
28722877

Tests/DependencyInjection/FrameworkExtensionTestCase.php

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@
5858
use Symfony\Component\HttpClient\Exception\ChunkCacheItemNotFoundException;
5959
use Symfony\Component\HttpClient\MockHttpClient;
6060
use Symfony\Component\HttpClient\RetryableHttpClient;
61-
use Symfony\Component\HttpClient\ScopingHttpClient;
6261
use Symfony\Component\HttpClient\ThrottlingHttpClient;
6362
use Symfony\Component\HttpFoundation\IpUtils;
6463
use Symfony\Component\HttpKernel\DependencyInjection\LoggerPass;
@@ -107,6 +106,7 @@
107106
use Symfony\Component\Workflow\WorkflowEvents;
108107
use Symfony\Contracts\Cache\CacheInterface;
109108
use Symfony\Contracts\Cache\TagAwareCacheInterface;
109+
use Symfony\Contracts\HttpClient\HttpClientInterface;
110110

111111
abstract class FrameworkExtensionTestCase extends TestCase
112112
{
@@ -2210,16 +2210,16 @@ public function testHttpClientDefaultOptions()
22102210

22112211
$this->assertTrue($container->hasDefinition('foo'), 'should have the "foo" service.');
22122212
$definition = $container->getDefinition('foo');
2213-
$this->assertSame(ScopingHttpClient::class, $definition->getClass());
2214-
$this->assertTrue($definition->hasTag('kernel.reset'));
2213+
$this->assertSame(HttpClientInterface::class, $definition->getClass());
2214+
$this->assertTrue($definition->hasTag('http_client.client'));
22152215
}
22162216

22172217
public function testScopedHttpClientWithoutQueryOption()
22182218
{
22192219
$container = $this->createContainerFromFile('http_client_scoped_without_query_option');
22202220

22212221
$this->assertTrue($container->hasDefinition('foo'), 'should have the "foo" service.');
2222-
$this->assertSame(ScopingHttpClient::class, $container->getDefinition('foo')->getClass());
2222+
$this->assertSame(HttpClientInterface::class, $container->getDefinition('foo')->getClass());
22232223
}
22242224

22252225
public function testHttpClientOverrideDefaultOptions()
@@ -2229,7 +2229,7 @@ public function testHttpClientOverrideDefaultOptions()
22292229
$this->assertSame(['foo' => 'bar'], $container->getDefinition('http_client.transport')->getArgument(0)['headers']);
22302230
$this->assertSame(['foo' => 'bar'], $container->getDefinition('http_client.transport')->getArgument(0)['extra']);
22312231
$this->assertSame(4, $container->getDefinition('http_client.transport')->getArgument(1));
2232-
$this->assertSame('http://example.com', $container->getDefinition('foo')->getArgument(1));
2232+
$this->assertSame('http://example.com', $container->getDefinition('foo.scoping')->getArgument(1));
22332233

22342234
$expected = [
22352235
'headers' => [
@@ -2241,7 +2241,7 @@ public function testHttpClientOverrideDefaultOptions()
22412241
'query' => [],
22422242
'resolve' => [],
22432243
];
2244-
$this->assertEquals($expected, $container->getDefinition('foo')->getArgument(2));
2244+
$this->assertEquals($expected, $container->getDefinition('foo.scoping')->getArgument(2));
22452245
}
22462246

22472247
public function testCachingHttpClient()
@@ -2258,26 +2258,26 @@ public function testCachingHttpClient()
22582258
$this->assertSame('http_client', $definition->getDecoratedService()[0]);
22592259
$this->assertCount(5, $arguments = $definition->getArguments());
22602260
$this->assertInstanceOf(Reference::class, $arguments[0]);
2261-
$this->assertSame('http_client.caching.inner', (string) $arguments[0]);
2261+
$this->assertSame('.inner', (string) $arguments[0]);
22622262
$this->assertInstanceOf(Reference::class, $arguments[1]);
22632263
$this->assertSame('foo', (string) $arguments[1]);
22642264
$this->assertArrayHasKey('headers', $arguments[2]);
22652265
$this->assertSame(['X-powered' => 'PHP'], $arguments[2]['headers']);
22662266
$this->assertFalse($arguments[3]);
22672267
$this->assertSame(2, $arguments[4]);
22682268

2269-
$this->assertTrue($container->hasDefinition('bar.transport.caching'));
2270-
$definition = $container->getDefinition('bar.transport.caching');
2269+
$this->assertTrue($container->hasDefinition('bar.caching'));
2270+
$definition = $container->getDefinition('bar.caching');
22712271
$this->assertSame(CachingHttpClient::class, $definition->getClass());
22722272
$arguments = $definition->getArguments();
22732273
$this->assertInstanceOf(Reference::class, $arguments[0]);
2274-
$this->assertSame('bar.transport.caching.inner', (string) $arguments[0]);
2274+
$this->assertSame('.inner', (string) $arguments[0]);
22752275
$this->assertInstanceOf(Reference::class, $arguments[1]);
22762276
$this->assertSame('baz', (string) $arguments[1]);
2277-
$scopedClient = $container->getDefinition('bar');
2277+
$scopedClient = $container->getDefinition('bar.scoping');
22782278

2279-
$this->assertSame('bar.transport', (string) $scopedClient->getArgument(0));
2280-
$this->assertNull($scopedClient->getDecoratedService());
2279+
$this->assertSame('.inner', (string) $scopedClient->getArgument(0));
2280+
$this->assertSame('bar', $scopedClient->getDecoratedService()[0]);
22812281
}
22822282

22832283
public function testHttpClientRetry()
@@ -2291,8 +2291,8 @@ public function testHttpClientRetry()
22912291
$this->assertSame(0.3, $container->getDefinition('http_client.retry_strategy')->getArgument(4));
22922292
$this->assertSame(2, $container->getDefinition('http_client.retryable')->getArgument(2));
22932293

2294-
$this->assertSame(RetryableHttpClient::class, $container->getDefinition('foo.transport.retryable')->getClass());
2295-
$this->assertSame(4, $container->getDefinition('foo.transport.retry_strategy')->getArgument(2));
2294+
$this->assertSame(RetryableHttpClient::class, $container->getDefinition('foo.retryable')->getClass());
2295+
$this->assertSame(4, $container->getDefinition('foo.retry_strategy')->getArgument(2));
22962296
}
22972297

22982298
public function testHttpClientWithQueryParameterKey()
@@ -2302,12 +2302,12 @@ public function testHttpClientWithQueryParameterKey()
23022302
$expected = [
23032303
'key' => 'foo',
23042304
];
2305-
$this->assertSame($expected, $container->getDefinition('foo')->getArgument(2)['query']);
2305+
$this->assertSame($expected, $container->getDefinition('foo.scoping')->getArgument(2)['query']);
23062306

23072307
$expected = [
23082308
'host' => '127.0.0.1',
23092309
];
2310-
$this->assertSame($expected, $container->getDefinition('foo')->getArgument(2)['resolve']);
2310+
$this->assertSame($expected, $container->getDefinition('foo.scoping')->getArgument(2)['resolve']);
23112311
}
23122312

23132313
public function testHttpClientFullDefaultOptions()
@@ -2353,19 +2353,19 @@ public function testHttpClientRateLimiter()
23532353
$this->assertSame('http_client', $definition->getDecoratedService()[0]);
23542354
$this->assertCount(2, $arguments = $definition->getArguments());
23552355
$this->assertInstanceOf(Reference::class, $arguments[0]);
2356-
$this->assertSame('http_client.throttling.inner', (string) $arguments[0]);
2356+
$this->assertSame('.inner', (string) $arguments[0]);
23572357
$this->assertInstanceOf(Reference::class, $arguments[1]);
23582358
$this->assertSame('http_client.throttling.limiter', (string) $arguments[1]);
23592359

2360-
$this->assertTrue($container->hasDefinition('foo.transport.throttling'));
2361-
$definition = $container->getDefinition('foo.transport.throttling');
2360+
$this->assertTrue($container->hasDefinition('foo.throttling'));
2361+
$definition = $container->getDefinition('foo.throttling');
23622362
$this->assertSame(ThrottlingHttpClient::class, $definition->getClass());
2363-
$this->assertSame('foo.transport', $definition->getDecoratedService()[0]);
2363+
$this->assertSame('foo', $definition->getDecoratedService()[0]);
23642364
$this->assertCount(2, $arguments = $definition->getArguments());
23652365
$this->assertInstanceOf(Reference::class, $arguments[0]);
2366-
$this->assertSame('foo.transport.throttling.inner', (string) $arguments[0]);
2366+
$this->assertSame('.inner', (string) $arguments[0]);
23672367
$this->assertInstanceOf(Reference::class, $arguments[1]);
2368-
$this->assertSame('foo.transport.throttling.limiter', (string) $arguments[1]);
2368+
$this->assertSame('foo.throttling.limiter', (string) $arguments[1]);
23692369
}
23702370

23712371
public static function provideMailer(): iterable

0 commit comments

Comments
 (0)