8000 feature #58249 [FrameworkBundle] Add ability to use existing service … · symfony/symfony@c8137fe · GitHub
[go: up one dir, main page]

Skip to content

Commit c8137fe

Browse files
committed
feature #58249 [FrameworkBundle] Add ability to use existing service as lock/semaphore resource (HypeMC)
This PR was merged into the 7.2 branch. Discussion ---------- [FrameworkBundle] Add ability to use existing service as lock/semaphore resource | Q | A | ------------- | --- | Branch? | 7.2 | Bug fix? | no | New feature? | yes | Deprecations? | no | Issues | - | License | MIT Contains #58250 Currently, it's not possible to set an existing service as the lock/semaphore resource via the config, even though both factories support this functionality, eg: https://github.com/symfony/symfony/blob/44395abfcb2c859b26e0c6880c74dadd94da1038/src/Symfony/Component/Lock/Store/StoreFactory.php#L27-L36 Commits ------- 670ee5d [FrameworkBundle] Add ability to use existing service as lock/semaphore resource
2 parents 940b303 + 670ee5d commit c8137fe

File tree

9 files changed

+131
-1
lines changed

9 files changed

+131
-1
lines changed

src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ CHANGELOG
1414
* Enable `json_decode_detailed_errors` in the default serializer context in debug mode by default when `seld/jsonlint` is installed
1515
* Register `Symfony\Component\Serializer\NameConverter\SnakeCaseToCamelCaseNameConverter` as a service named `serializer.name_converter.snake_case_to_camel_case` if available
1616
* Deprecate `session.sid_length` and `session.sid_bits_per_character` config options
17+
* Add the ability to use an existing service as a lock/semaphore resource
1718

1819
7.1
1920
---

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1230,7 +1230,7 @@ private function registerSessionConfiguration(array $config, ContainerBuilder $c
12301230
}
12311231
$container->resolveEnvPlaceholders($config['handler_id'], null, $usedEnvs);
12321232

1233-
if ($usedEnvs || preg_match('#^[a-z]++://#', $config['handler_id'])) {
1233+
if ($usedEnvs || str_contains($config['handler_id'], '://')) {
12341234
$id = '.cache_connection.'.ContainerBuilder::hash($config['handler_id']);
12351235

12361236
$container->getDefinition('session.abstract_handler')
@@ -2004,6 +2004,9 @@ private function registerLockConfiguration(array $config, ContainerBuilder $cont
20042004
$storeDefinitions = [];
20052005
foreach ($resourceStores as $resourceStore) {
20062006
$storeDsn = $container->resolveEnvPlaceholders($resourceStore, null, $usedEnvs);
2007+
if (!$usedEnvs && !str_contains($resourceStore, '://')) {
2008+
$resourceStore = new Reference($resourceStore);
2009+
}
20072010
$storeDefinition = new Definition(PersistingStoreInterface::class);
20082011
$storeDefinition
20092012
->setFactory([StoreFactory::class, 'createStore'])
@@ -2045,6 +2048,9 @@ private function registerSemaphoreConfiguration(array $config, ContainerBuilder
20452048

20462049
foreach ($config['resources'] as $resourceName => $resourceStore) {
20472050
$storeDsn = $container->resolveEnvPlaceholders($resourceStore, null, $usedEnvs);
2051+
if (!$usedEnvs && !str_contains($resourceStore, '://')) {
2052+
$resourceStore = new Reference($resourceStore);
2053+
}
20482054
$storeDefinition = new Definition(SemaphoreStoreInterface::class);
20492055
$storeDefinition->setFactory([SemaphoreStoreFactory::class, 'createStore']);
20502056
$storeDefinition->setArguments([$resourceStore]);
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
$container->register('my_service', \Redis::class);
4+
$container->setAlias('factory_public_alias', 'lock.default.factory')
5+
->setPublic(true);
6+
7+
$container->loadFromExtension('framework', [
8+
'annotations' => false,
9+
'http_method_override' => false,
10+
'handle_all_throwables' => true,
11+
'php_errors' => ['log' => true],
12+
'lock' => 'my_service',
13+
]);
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
$container->register('my_service', \Redis::class);
4+
$container->setAlias('factory_public_alias', 'semaphore.default.factory')
5+
->setPublic(true);
6+
7+
$container->loadFromExtension('framework', [
8+
'annotations' => false,
9+
'http_method_override' => false,
10+
'handle_all_throwables' => true,
11+
'php_errors' => ['log' => true],
12+
'semaphore' => 'my_service',
13+
]);
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?xml version="1.0" ?>
2+
<container xmlns="http://symfony.com/schema/dic/services"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xmlns:framework="http://symfony.com/schema/dic/symfony"
5+
xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd
6+
http://symfony.com/schema/dic/symfony https://symfony.com/schema/dic/symfony/symfony-1.0.xsd">
7+
8+
<services>
9+
<service id="my_service" class="\Redis" />
10+
<service id="factory_public_alias" alias="lock.default.factory" public="true" />
11+
</services>
12+
13+
<framework:config http-method-override="false" handle-all-throwables="true">
14+
<framework:annotations enabled="false" />
15+
<framework:php-errors log="true" />
16+
<framework:lock>
17+
<framework:resource>my_service</framework:resource>
18+
</framework:lock>
19+
</framework:config>
20+
</container>
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?xml version="1.0" ?>
2+
<container xmlns="http://symfony.com/schema/dic/services"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xmlns:framework="http://symfony.com/schema/dic/symfony"
5+
xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd
6+
http://symfony.com/schema/dic/symfony https://symfony.com/schema/dic/symfony/symfony-1.0.xsd">
7+
8+
<services>
9+
<service id="my_service" class="\Redis" />
10+
<service id="factory_public_alias" alias="semaphore.default.factory" public="true" />
11+
</services>
12+
13+
<framework:config http-method-override="false" handle-all-throwables="true">
14+
<framework:annotations enabled="false" />
15+
<framework:php-errors log="true" />
16+
<framework:semaphore>
17+
<framework:resource>my_service</framework:resource>
18+
</framework:semaphore>
19+
</framework:config>
20+
</container>
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
services:
2+
my_service:
3+
class: \Redis
4+
factory_public_alias:
5+
alias: lock.default.factory
6+
public: true
7+
8+
framework:
9+
annotations: false
10+
http_method_override: false
11+
handle_all_throwables: true
12+
php_errors:
13+
log: true
14+
lock: my_service
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
services:
2+
my_service:
3+
class: \Redis
4+
factory_public_alias:
5+
alias: semaphore.default.factory
6+
public: true
7+
8+
framework:
9+
annotations: false
10+
http_method_override: false
11+
handle_all_throwables: true
12+
php_errors:
13+
log: true
14+
semaphore: my_service

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

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument;
3535
use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument;
3636
use Symfony\Component\DependencyInjection\ChildDefinition;
37+
use Symfony\Component\DependencyInjection\Compiler\ResolveChildDefinitionsPass;
3738
use Symfony\Component\DependencyInjection\Compiler\ResolveInstanceofConditionalsPass;
3839
use Symfony\Component\DependencyInjection\Compiler\ResolveTaggedIteratorArgumentPass;
3940
use Symfony\Component\DependencyInjection\ContainerBuilder;
@@ -57,6 +58,7 @@
5758
use Symfony\Component\HttpFoundation\IpUtils;
5859
use Symfony\Component\HttpKernel\DependencyInjection\LoggerPass;
5960
use Symfony\Component\HttpKernel\Fragment\FragmentUriGeneratorInterface;
61+
use Symfony\Component\Lock\LockFactory;
6062
use Symfony\Component\Lock\Store\SemaphoreStore;
6163
use Symfony\Component\Messenger\Bridge\AmazonSqs\Transport\AmazonSqsTransportFactory;
6264
use Symfony\Component\Messenger\Bridge\Amqp\Transport\AmqpTransportFactory;
@@ -67,6 +69,7 @@
6769
use Symfony\Component\Notifier\TexterInterface;
6870
use Symfony\Component\PropertyAccess\PropertyAccessor;
6971
use Symfony\Component\Security\Core\AuthenticationEvents;
72+
use Symfony\Component\Semaphore\SemaphoreFactory;
7073
use Symfony\Component\Serializer\Mapping\Loader\AttributeLoader;
7174
use Symfony\Component\Serializer\Mapping\Loader\XmlFileLoader;
7275
use Symfony\Component\Serializer\Mapping\Loader\YamlFileLoader;
@@ -2433,6 +2436,19 @@ public function testNamedLocks()
24332436
self::assertStringContainsString('REDIS_DSN', $storeDef->getArgument(0));
24342437
}
24352438

2439+
public function testLockWithService()
2440+
{
2441+
$container = $this->createContainerFromFile('lock_service', [], true, false);
2442+
$container->getCompilerPassConfig()->setOptimizationPasses([new ResolveChildDefinitionsPass()]);
2443+
$container->compile();
2444+
2445+
self::assertTrue($container->hasDefinition('lock.default.factory'));
2446+
$storeDef = $container->getDefinition($container->getDefinition('lock.default.factory')->getArgument(0));
2447+
self::assertEquals(new Reference('my_service'), $storeDef->getArgument(0));
2448+
2449+
self::assertInstanceOf(LockFactory::class, $container->get('factory_public_alias'));
2450+
}
2451+
24362452
public function testDefaultSemaphore()
24372453
{
24382454
$container = $this->createContainerFromFile('semaphore');
@@ -2455,6 +2471,19 @@ public function testNamedSemaphores()
24552471
self::assertStringContainsString('REDIS_DSN', $storeDef->getArgument(0));
24562472
}
24572473

2474+
public function testSemaphoreWithService()
2475+
{
2476+
$container = $this->createContainerFromFile('semaphore_service', [], true, false);
2477+
$container->getCompilerPassConfig()->setOptimizationPasses([new ResolveChildDefinitionsPass()]);
2478+
$container->compile();
2479+
2480+
self::assertTrue($container->hasDefinition('semaphore.default.factory'));
2481+
$storeDef = $container->getDefinition($container->getDefinition('semaphore.default.factory')->getArgument(0));
2482+
self::assertEquals(new Reference('my_service'), $storeDef->getArgument(0));
2483+
2484+
self::assertInstanceOf(SemaphoreFactory::class, $container->get('factory_public_alias'));
2485+
}
2486+
24582487
protected function createContainer(array $data = [])
24592488
{
24602489
return new ContainerBuilder(new EnvPlaceholderParameterBag(array_merge([

0 commit comments

Comments
 (0)
0