Skip to content

Commit 319a90a

Browse files
Fix - Symfony - load custom strategies in db_tools.storage service (#216)
1 parent d0cb632 commit 319a90a

File tree

6 files changed

+57
-25
lines changed

6 files changed

+57
-25
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/Laravel/DbToolsServiceProvider.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ public function register(): void
110110
foreach ($connections as $connectionName => $connection) {
111111
$strategyId = $connection->getStorageFilenameStrategy();
112112

113-
if ($strategyId === null || $strategyId === 'default' || $strategyId === 'datetime') {
113+
if ($strategyId === 'default' || $strategyId === 'datetime') {
114114
$strategy = new DefaultFilenameStrategy();
115115
} elseif ($app->bound($strategyId)) {
116116
$strategy = $app->make($strategyId);

src/Bridge/Symfony/DependencyInjection/DbToolsExtension.php

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -85,27 +85,28 @@ 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+
$strategyServices = [];
89+
foreach ($config['connections'] as $connectionName => $connectionConfig) {
9090
// Default is handled directly by the storage service.
91+
$strategyId = $connectionConfig['storage_filename_strategy'] ?? null;
9192
if ($strategyId !== null && $strategyId !== 'default' && $strategyId !== 'datetime') {
9293
if ($container->hasDefinition($strategyId)) {
93-
$strategies[$connectionName] = new Reference($strategyId);
94+
$strategyServices[$connectionName] = new Reference($strategyId);
9495
} elseif (\class_exists($strategyId)) {
9596
if (!\is_subclass_of($strategyId, FilenameStrategyInterface::class)) {
9697
throw new InvalidArgumentException(\sprintf('"db_tools.connections.%s.filename_strategy": class "%s" does not implement "%s"', $connectionName, $strategyId, FilenameStrategyInterface::class));
9798
}
9899
$serviceId = '.db_tools.filename_strategy.' . \sha1($strategyId);
99100
$container->setDefinition($serviceId, (new Definition())->setClass($strategyId));
100-
$strategies[$connectionName] = new Reference($serviceId);
101+
$strategyServices[$connectionName] = new Reference($serviceId);
101102
} else {
102103
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));
103104
}
104105
break;
105106
}
106107
}
107-
if ($strategies) {
108-
$container->getDefinition('db_tools.storage')->setArgument(1, $strategies);
108+
if ($strategyServices) {
109+
$container->getDefinition('db_tools.storage')->setArgument(1, $strategyServices);
109110
}
110111
}
111112

src/Configuration/ConfigurationRegistry.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ public function getDefaultConnection(): ?string
3131
return null;
3232
}
3333

34+
/**
35+
* @return array<string,Configuration>
36+
*/
3437
public function getConnectionConfigAll(): array
3538
{
3639
return $this->connections;
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace MakinaCorpus\DbToolsBundle\Tests\Resources\FilenameStrategy;
6+
7+
use MakinaCorpus\DbToolsBundle\Storage\AbstractFilenameStrategy;
8+
9+
class CustomFilenameStrategy extends AbstractFilenameStrategy
10+
{
11+
#[\Override]
12+
public function generateFilename(
13+
string $connectionName = 'default',
14+
string $extension = 'sql',
15+
bool $anonymized = false
16+
): string {
17+
$now = new \DateTimeImmutable();
18+
19+
return \sprintf(
20+
'%s/custom%s-%s.%s',
21+
$connectionName,
22+
$anonymized ? '-anonymized' : '',
23+
$now->format('YmdHis'),
24+
$extension
25+
);
26+
}
27+
}

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)