8000 [FrameworkBundle] Add ability to use existing service as lock/semapho… · symfony/symfony@e91d7aa · GitHub
[go: up one dir, main page]

Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit e91d7aa

Browse files
committed
[FrameworkBundle] Add ability to use existing service as lock/semaphore resource
1 parent 7b41875 commit e91d7aa

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\Messenger\Bridge\AmazonSqs\Transport\AmazonSqsTransportFactory;
6163
use Symfony\Component\Messenger\Bridge\Amqp\Transport\AmqpTransportFactory;
6264
use Symfony\Component\Messenger\Bridge\Beanstalkd\Transport\BeanstalkdTransportFactory;
@@ -66,6 +68,7 @@
6668
use Symfony\Component\Notifier\TexterInterface;
6769
use Symfony\Component\PropertyAccess\PropertyAccessor;
6870
use Symfony\Component\Security\Core\AuthenticationEvents;
71+
use Symfony\Component\Semaphore\SemaphoreFactory;
6972
use Symfony\Component\Serializer\Mapping\Loader\AttributeLoader;
7073
use Symfony\Component\Serializer\Mapping\Loader\XmlFileLoader;
7174
use Symfony\Component\Serializer\Mapping\Loader\YamlFileLoader;
@@ -2427,6 +2430,19 @@ public function testNamedLocks()
24272430
self::assertStringContainsString('REDIS_DSN', $storeDef->getArgument(0));
24282431
}
24292432

2433+
public function testLockWithService()
2434+
{
2435+
$container = $this->createContainerFromFile('lock_service', [], true, false);
2436+
$container->getCompilerPassConfig()->setOptimizationPasses([new ResolveChildDefinitionsPass()]);
2437+
$container->compile();
2438+
2439+
self::assertTrue($container->hasDefinition('lock.default.factory'));
2440+
$storeDef = $container->getDefinition($container->getDefinition('lock.default.factory')->getArgument(0));
2441+
self::assertEquals(new Reference('my_service'), $storeDef->getArgument(0));
2442+
2443+
self::assertInstanceOf(LockFactory::class, $container->get('factory_public_alias'));
2444+
}
2445+
24302446
public function testDefaultSemaphore()
24312447
{
24322448
$container = $this->createContainerFromFile('semaphore');
@@ -2449,6 +2465,19 @@ public function testNamedSemaphores()
24492465
self::assertStringContainsString('REDIS_DSN', $storeDef->getArgument(0));
24502466
}
24512467

2468+
public function testSemaphoreWithService()
2469+
{
2470+
$container = $this->createContainerFromFile('semaphore_service', [], true, false);
2471+
$container->getCompilerPassConfig()->setOptimizationPasses([new ResolveChildDefinitionsPass()]);
2472+
$container->compile();
2473+
2474+
self::assertTrue($container->hasDefinition('semaphore.default.factory'));
2475+
$storeDef = $container->getDefinition($container->getDefinition('semaphore.default.factory')->getArgument(0));
2476+
self::assertEquals(new Reference('my_service'), $storeDef->getArgument(0));
2477+
2478+
self::assertInstanceOf(SemaphoreFactory::class, $container->get('factory_public_alias'));
2479+
}
2480+
24522481
protected function createContainer(array $data = [])
24532482
{
24542483
return new ContainerBuilder(new EnvPlaceholderParameterBag(array_merge([

0 commit comments

Comments
 (0)
0