Skip to content

Commit 4f68e08

Browse files
committed
frameworkbundle configuration/tests
1 parent f785113 commit 4f68e08

File tree

4 files changed

+98
-0
lines changed

4 files changed

+98
-0
lines changed

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2498,6 +2498,24 @@ private function addRateLimiterSection(ArrayNodeDefinition $rootNode, callable $
24982498
})
24992499
->end()
25002500
->children()
2501+
->arrayNode('builder')
2502+
->info('Configuration for the RateLimiterBuilder service.')
2503+
->addDefaultsIfNotSet()
2504+
->children()
2505+
->scalarNode('lock_factory')
2506+
->info('The service ID of the lock factory to use with the RateLimiterBuilder.')
2507+
->defaultValue('auto')
2508+
->end()
2509+
->scalarNode('cache_pool')
2510+
->info('The cache pool to use with RateLimiterBuilder.')
2511+
->defaultValue('cache.rate_limiter')
2512+
->end()
2513+
->scalarNode('storage_service')
2514+
->info('The service ID of a custom storage implementation, this precedes any configured "cache_pool".')
2515+
->defaultNull()
2516+
->end()
2517+
->end()
2518+
->end()
25012519
->arrayNode('limiters')
25022520
->useAttributeAsKey('name')
25032521
->arrayPrototype()

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@
159159
use Symfony\Component\PropertyInfo\PropertyListExtractorInterface;
160160
use Symfony\Component\PropertyInfo\PropertyTypeExtractorInterface;
161161
use Symfony\Component\RateLimiter\LimiterInterface;
162+
use Symfony\Component\RateLimiter\RateLimiterBuilder;
162163
use Symfony\Component\RateLimiter\RateLimiterFactory;
163164
use Symfony\Component\RateLimiter\RateLimiterFactoryInterface;
164165
use Symfony\Component\RateLimiter\Storage\CacheStorage;
@@ -3258,6 +3259,38 @@ private function registerRateLimiterConfiguration(array $config, ContainerBuilde
32583259
$container->registerAliasForArgument($limiterId, RateLimiterFactoryInterface::class, $name.'.limiter');
32593260
}
32603261
}
3262+
3263+
if (class_exists(RateLimiterBuilder::class)) {
3264+
$builderConfig = $config['builder'];
3265+
3266+
if ('auto' === $builderConfig['lock_factory']) {
3267+
$builderConfig['lock_factory'] = $this->isInitializedConfigEnabled('lock') ? 'lock.factory' : null;
3268+
}
3269+
3270+
$builder = $container->getDefinition('limiter_builder');
3271+
3272+
if (null === $storageId = $builderConfig['storage_service'] ?? null) {
3273+
$container->register($storageId = 'limiter_builder.storage', CacheStorage::class)->addArgument(new Reference($builderConfig['cache_pool']));
3274+
}
3275+
3276+
$builder->replaceArgument(0, new Reference($storageId));
3277+
3278+
if ($builderConfig['lock_factory']) {
3279+
if (!interface_exists(LockInterface::class)) {
3280+
throw new LogicException('Rate Limiter Builder requires the Lock component to be installed. Try running "composer require symfony/lock".');
3281+
}
3282+
3283+
if (!$this->isInitializedConfigEnabled('lock')) {
3284+
throw new LogicException('Rate Limiter Builder requires the Lock component to be configured.');
3285+
}
3286+
3287+
$builder->replaceArgument(1, new Reference($builderConfig['lock_factory']));
3288+
}
3289+
3290+
$container->setAlias(RateLimiterBuilder::class, 'limiter_builder');
3291+
} else {
3292+
$container->removeDefinition('limiter_builder');
3293+
}
32613294
}
32623295

32633296
private function registerUidConfiguration(array $config, ContainerBuilder $container, PhpFileLoader $loader): void

src/Symfony/Bundle/FrameworkBundle/Resources/config/rate_limiter.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111

1212
namespace Symfony\Component\DependencyInjection\Loader\Configurator;
1313

14+
use Symfony\Component\RateLimiter\RateLimiterBuilder;
1415
use Symfony\Component\RateLimiter\RateLimiterFactory;
16+
use Symfony\Component\RateLimiter\Storage\CacheStorage;
1517

1618
return static function (ContainerConfigurator $container) {
1719
$container->services()
@@ -26,5 +28,11 @@
2628
abstract_arg('storage'),
2729
null,
2830
])
31+
32+
->set('limiter_builder', RateLimiterBuilder::class)
33+
->args([
34+
abstract_arg('storage'),
35+
null,
36+
])
2937
;
3038
};

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/PhpFrameworkExtensionTest.php

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use Symfony\Component\DependencyInjection\Exception\LogicException;
1818
use Symfony\Component\DependencyInjection\Exception\OutOfBoundsException;
1919
use Symfony\Component\DependencyInjection\Loader\PhpFileLoader;
20+
use Symfony\Component\RateLimiter\RateLimiterBuilder;
2021
use Symfony\Component\Workflow\Exception\InvalidDefinitionException;
2122

2223
class PhpFrameworkExtensionTest extends FrameworkExtensionTestCase
@@ -265,4 +266,42 @@ public function testRateLimiterIsTagged()
265266
$this->assertSame('first', $container->getDefinition('limiter.first')->getTag('rate_limiter')[0]['name']);
266267
$this->assertSame('second', $container->getDefinition('limiter.second')->getTag('rate_limiter')[0]['name']);
267268
}
269+
270+
public function testRateLimiterBuilderDefault()
271+
{
272+
$container = $this->createContainerFromClosure(function (ContainerBuilder $container) {
273+
$container->loadFromExtension('framework', [
274+
'annotations' => false,
275+
'http_method_override' => false,
276+
'handle_all_throwables' => true,
277+
'php_errors' => ['log' => true],
278+
'rate_limiter' => true,
279+
]);
280+
});
281+
282+
$this->assertSame('cache.rate_limiter', (string) $container->getDefinition('limiter_builder.storage')->getArgument(0));
283+
284+
$builder = $container->getDefinition('limiter_builder');
285+
$this->assertSame('limiter_builder.storage', (string) $builder->getArgument(0));
286+
$this->assertNull($builder->getArgument(1));
287+
288+
$this->assertSame('limiter_builder', (string) $container->getAlias(RateLimiterBuilder::class));
289+
}
290+
291+
public function testRateLimiterBuilderDefaultWithLock()
292+
{
293+
$container = $this->createContainerFromClosure(function (ContainerBuilder $container) {
294+
$container->loadFromExtension('framework', [
295+
'annotations' => false,
296+
'http_method_override' => false,
297+
'handle_all_throwables' => true,
298+
'php_errors' => ['log' => true],
299+
'lock' => true,
300+
'rate_limiter' => true,
301+
]);
302+
});
303+
304+
$builder = $container->getDefinition('limiter_builder');
305+
$this->assertSame('lock.factory', (string) $builder->getArgument(1));
306+
}
268307
}

0 commit comments

Comments
 (0)