Skip to content

Commit 71beb52

Browse files
committed
feat: allow prepend on adapter definition builder
1 parent 12fd428 commit 71beb52

File tree

2 files changed

+55
-5
lines changed

2 files changed

+55
-5
lines changed

src/DependencyInjection/FlysystemExtension.php

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
use Symfony\Component\DependencyInjection\ContainerBuilder;
2727
use Symfony\Component\DependencyInjection\Definition;
2828
use Symfony\Component\DependencyInjection\Extension\Extension;
29+
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
2930
use Symfony\Component\DependencyInjection\Reference;
3031
use Symfony\Component\OptionsResolver\OptionsResolver;
3132

@@ -36,14 +37,23 @@
3637
*
3738
* @internal
3839
*/
39-
final class FlysystemExtension extends Extension
40+
final class FlysystemExtension extends Extension implements PrependExtensionInterface
4041
{
4142
/** @var list<AdapterDefinitionBuilderInterface> */
4243
private array $adapterDefinitionBuilders = [];
4344

4445
/** @var array<string, AdapterDefinitionBuilderInterface>|null */
4546
private ?array $adapterDefinitionBuildersCache = null;
4647

48+
public function prepend(ContainerBuilder $container): void
49+
{
50+
foreach ($this->getAdapterDefinitionBuilders() as $builder) {
51+
if ($builder instanceof PrependExtensionInterface) {
52+
$builder->prepend($container);
53+
}
54+
}
55+
}
56+
4757
public function getConfiguration(array $config, ContainerBuilder $container): ?ConfigurationInterface
4858
{
4959
return new Configuration($this->getAdapterDefinitionBuilders());
@@ -68,9 +78,11 @@ public function load(array $configs, ContainerBuilder $container): void
6878

6979
public function addAdapterDefinitionBuilder(AdapterDefinitionBuilderInterface $builder): void
7080
{
81+
if (null !== $this->adapterDefinitionBuildersCache) {
82+
throw new \LogicException(sprintf('Cannot add adapter definition builder "%s" after the builders cache has been computed. Builders must be registered before the container is compiled.', $builder::class));
83+
}
84+
7185
$this->adapterDefinitionBuilders[] = $builder;
72-
// Invalidate cache when adding new builder
73-
$this->adapterDefinitionBuildersCache = null;
7486
}
7587

7688
private function registerPushCommand(ContainerBuilder $container): void

tests/DependencyInjection/FlysystemExtensionTest.php

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,13 @@
1818
use League\Flysystem\Filesystem;
1919
use League\Flysystem\FilesystemOperator;
2020
use League\Flysystem\UnableToWriteFile;
21+
use League\FlysystemBundle\Adapter\Builder\AdapterDefinitionBuilderInterface;
22+
use League\FlysystemBundle\DependencyInjection\FlysystemExtension;
2123
use MicrosoftAzure\Storage\Blob\BlobRestProxy;
2224
use PHPUnit\Framework\TestCase;
25+
use Symfony\Component\Config\Definition\Builder\NodeDefinition;
26+
use Symfony\Component\DependencyInjection\ContainerBuilder;
27+
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
2328
use Symfony\Component\Dotenv\Dotenv;
2429
use Tests\League\FlysystemBundle\Kernel\FlysystemAppKernel;
2530

@@ -51,9 +56,9 @@ public function testFilesystems(string $fsName): void
5156
$kernel = $this->createFlysystemKernel();
5257
$container = $kernel->getContainer()->get('test.service_container');
5358

54-
$fs = $container->get('flysystem.test.'.$fsName);
59+
$fs = $container->get('flysystem.test.' . $fsName);
5560

56-
$this->assertInstanceOf(FilesystemOperator::class, $fs, 'Filesystem "'.$fsName.'" should be an instance of FilesystemOperator');
61+
$this->assertInstanceOf(FilesystemOperator::class, $fs, 'Filesystem "' . $fsName . '" should be an instance of FilesystemOperator');
5762
}
5863

5964
/**
@@ -137,6 +142,39 @@ public function testNotRetainingVisibilityPreventsAclCommandInvocation(): void
137142
self::assertFalse($calledGetObjectAcl, 'The ACL command should not be called when `retain_visibility` is set to `false`.');
138143
}
139144

145+
public function testPrependCallsPrependOnBuildersThatImplementIt(): void
146+
{
147+
$container = new ContainerBuilder();
148+
$prepended = false;
149+
150+
$builder = new class($prepended) implements AdapterDefinitionBuilderInterface, PrependExtensionInterface {
151+
public function __construct(private bool &$prepended) {}
152+
public function getName(): string
153+
{
154+
return 'test';
155+
}
156+
public function getRequiredPackages(): array
157+
{
158+
return [];
159+
}
160+
public function addConfiguration(NodeDefinition $node): void {}
161+
public function createAdapter(ContainerBuilder $container, string $storageName, array $options, ?string $defaultVisibilityForDirectories): ?string
162+
{
163+
return null;
164+
}
165+
public function prepend(ContainerBuilder $container): void
166+
{
167+
$this->prepended = true;
168+
}
169+
};
170+
171+
$extension = new FlysystemExtension();
172+
$extension->addAdapterDefinitionBuilder($builder);
173+
$extension->prepend($container);
174+
175+
$this->assertTrue($prepended);
176+
}
177+
140178
private function createFlysystemKernel(): FlysystemAppKernel
141179
{
142180
(new Dotenv())->populate([

0 commit comments

Comments
 (0)