Skip to content

Commit 0644773

Browse files
committed
Fix - Symfony - load custom strategies in db_tools.storage service (#26)
1 parent d0cb632 commit 0644773

File tree

3 files changed

+32
-24
lines changed

3 files changed

+32
-24
lines changed

docs/content/configuration/reference.md

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -623,19 +623,12 @@ db_tools:
623623
```
624624
@@@
625625
@@@ standalone docker
626-
```yaml
627-
# Default value, `default` is an alias of `datetime`.
628-
storage_filename_strategy: default
629-
630-
# Explicit default.
631-
storage_filename_strategy: datetime
632-
633-
# Using a service name.
634-
storage_filename_strategy: app.my_filename_strategy
626+
:::warning
627+
There is as of now no way to implement a custom filename strategy when using
628+
*DbToolsBundle* as a standalone CLI tool or with the Docker image.
635629
636-
# Using a class name.
637-
storage_filename_strategy: App\DbTools\Storage\MyCustomFilenameStrategy
638-
```
630+
If you need this feature, please let us know by [creating an issue](https://github.com/makinacorpus/DbToolsBundle/issues).
631+
:::
639632
@@@
640633
641634
:::tip

src/Bridge/Symfony/DependencyInjection/DbToolsExtension.php

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -85,27 +85,34 @@ public function load(array $configs, ContainerBuilder $container): void
8585
$container->setParameter('db_tools.anonymization.anonymizer.paths', $anonymizerPaths);
8686

8787
// Register filename strategies.
88-
$strategies = [];
89-
foreach (($config['storage']['filename_strategy'] ?? []) as $connectionName => $strategyId) {
88+
$strategies = [
89+
$config['storage_filename_strategy'] ?? null,
90+
...\array_map(
91+
fn($connectionConfig) => $connectionConfig['storage_filename_strategy'] ?? null,
92+
$config['connections']
93+
)
94+
];
95+
$strategiesServices = [];
96+
foreach ($strategies as $connectionName => $strategyId) {
9097
// Default is handled directly by the storage service.
9198
if ($strategyId !== null && $strategyId !== 'default' && $strategyId !== 'datetime') {
9299
if ($container->hasDefinition($strategyId)) {
93-
$strategies[$connectionName] = new Reference($strategyId);
100+
$strategiesServices[$connectionName] = new Reference($strategyId);
94101
} elseif (\class_exists($strategyId)) {
95102
if (!\is_subclass_of($strategyId, FilenameStrategyInterface::class)) {
96103
throw new InvalidArgumentException(\sprintf('"db_tools.connections.%s.filename_strategy": class "%s" does not implement "%s"', $connectionName, $strategyId, FilenameStrategyInterface::class));
97104
}
98105
$serviceId = '.db_tools.filename_strategy.' . \sha1($strategyId);
99106
$container->setDefinition($serviceId, (new Definition())->setClass($strategyId));
100-
$strategies[$connectionName] = new Reference($serviceId);
107+
$strategiesServices[$connectionName] = new Reference($serviceId);
101108
} else {
102109
throw new InvalidArgumentException(\sprintf('"db_tools.connections.%s.filename_strategy": class or service "%s" does not exist or is not registered in container', $connectionName, $strategyId));
103110
}
104111
break;
105112
}
106113
}
107-
if ($strategies) {
108-
$container->getDefinition('db_tools.storage')->setArgument(1, $strategies);
114+
if ($strategiesServices) {
115+
$container->getDefinition('db_tools.storage')->setArgument(1, $strategiesServices);
109116
}
110117
}
111118

tests/Unit/Bridge/Symfony/DependencyInjection/DbToolsExtensionTest.php

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@
44

55
namespace MakinaCorpus\DbToolsBundle\Tests\Unit\Bridge\Symfony\DependencyInjection;
66

7-
use MakinaCorpus\DbToolsBundle\Anonymization\AnonymizatorFactory;
87
use MakinaCorpus\DbToolsBundle\Bridge\Symfony\DependencyInjection\DbToolsExtension;
98
use MakinaCorpus\DbToolsBundle\Configuration\ConfigurationRegistry;
9+
use MakinaCorpus\DbToolsBundle\Tests\Resources\FilenameStrategy\CustomFilenameStrategy;
1010
use PHPUnit\Framework\TestCase;
1111
use PHPUnit\Framework\Attributes\After;
1212
use PHPUnit\Framework\Attributes\DependsExternal;
1313
use Symfony\Component\DependencyInjection\ContainerBuilder;
14+
use Symfony\Component\DependencyInjection\Definition;
1415
use Symfony\Component\DependencyInjection\ParameterBag\EnvPlaceholderParameterBag;
1516

1617
class DbToolsExtensionTest extends TestCase
@@ -31,10 +32,11 @@ private function getContainer(array $parameters = [], array $bundles = []): Cont
3132
return $container;
3233
}
3334

34-
private function testExtension(array $config): void
35+
private function testExtension(array $config, ContainerBuilder $container = null): void
3536
{
37+
$container ??= $this->getContainer();
3638
$extension = new DbToolsExtension();
37-
$extension->load([$config], $container = $this->getContainer());
39+
$extension->load([$config], $container);
3840

3941
// No need to test them all, simply validate the config was loaded.
4042
self::assertTrue($container->hasDefinition('db_tools.storage'));
@@ -95,7 +97,9 @@ public function testEnvVarAreOverridenByConfiguration(array $config): void
9597
$this->setAllDbToolsEnv();
9698

9799
$extension = new DbToolsExtension();
98-
$extension->load([$config], $container = $this->getContainer());
100+
$container = $this->getContainer();
101+
$container->setDefinition('one_strategy', (new Definition())->setClass(CustomFilenameStrategy::class));
102+
$extension->load([$config], $container);
99103
$container->getDefinition('db_tools.configuration.registry')->setPublic(true);
100104
$container->compile(true);
101105

@@ -147,7 +151,9 @@ public function testConnectionResolveParentForNonSetValues(array $config): void
147151
$this->setAllDbToolsEnv();
148152

149153
$extension = new DbToolsExtension();
150-
$extension->load([$config], $container = $this->getContainer());
154+
$container = $this->getContainer();
155+
$container->setDefinition('one_strategy', (new Definition())->setClass(CustomFilenameStrategy::class));
156+
$extension->load([$config], $container);
151157
$container->getDefinition('db_tools.configuration.registry')->setPublic(true);
152158
$container->compile(true);
153159

@@ -215,7 +221,9 @@ public function testExtensionWithMinimalConfig(array $config): void
215221
#[DependsExternal(DbToolsConfigurationTest::class, 'testConfigurationFull')]
216222
public function testExtensionWithFullConfig(array $config): void
217223
{
218-
$this->testExtension($config);
224+
$container = $this->getContainer();
225+
$container->setDefinition('one_strategy', (new Definition())->setClass(CustomFilenameStrategy::class));
226+
$this->testExtension($config, $container);
219227
}
220228

221229
#[DependsExternal(DbToolsConfigurationTest::class, 'testConfigurationFull')]

0 commit comments

Comments
 (0)