Skip to content

Commit 5eb41be

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

File tree

2 files changed

+58
-1
lines changed

2 files changed

+58
-1
lines changed

src/DependencyInjection/FlysystemExtension.php

Lines changed: 11 additions & 1 deletion
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());

tests/DependencyInjection/FlysystemExtensionTest.php

Lines changed: 47 additions & 0 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

@@ -137,6 +142,48 @@ 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+
{
153+
}
154+
155+
public function getName(): string
156+
{
157+
return 'test';
158+
}
159+
160+
public function getRequiredPackages(): array
161+
{
162+
return [];
163+
}
164+
165+
public function addConfiguration(NodeDefinition $node): void
166+
{
167+
}
168+
169+
public function createAdapter(ContainerBuilder $container, string $storageName, array $options, ?string $defaultVisibilityForDirectories): ?string
170+
{
171+
return null;
172+
}
173+
174+
public function prepend(ContainerBuilder $container): void
175+
{
176+
$this->prepended = true;
177+
}
178+
};
179+
180+
$extension = new FlysystemExtension();
181+
$extension->addAdapterDefinitionBuilder($builder);
182+
$extension->prepend($container);
183+
184+
$this->assertTrue($prepended);
185+
}
186+
140187
private function createFlysystemKernel(): FlysystemAppKernel
141188
{
142189
(new Dotenv())->populate([

0 commit comments

Comments
 (0)