Skip to content

Commit 4158e89

Browse files
committed
feat: Allow custom adapter registration
This PR implements a solution to the issue discussed in thephpleague#181, enabling external bundles to register their custom storage adapters with Flysystem Bundle without requiring them to be directly added to the main bundle's codebase. I had to remove the `@internal` annotation from `AdapterDefinitionBuilderInterface` and `AbstractAdapterDefinitionBuilder` to allow them to be referenced by other bundles. ## Usage Example External bundles can now register their adapters as follows: ``` php class AzureBlobStorageAdapterBundle extends Bundle { /** * {@inheritdoc} */ public function build(ContainerBuilder $container): void { parent::build($container); /** @var FlysystemExtension $extension */ $extension = $container->getExtension('flysystem'); $extension->addAdapterDefinitionBuilder(new AzureOssAdapterDefinitionBuilder()); } } ```
1 parent 4587fe0 commit 4158e89

File tree

5 files changed

+17
-9
lines changed

5 files changed

+17
-9
lines changed

src/Adapter/AdapterDefinitionFactory.php

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,12 @@ final class AdapterDefinitionFactory
2626
*/
2727
private array $builders;
2828

29-
public function __construct()
29+
/**
30+
* @param list<AdapterDefinitionBuilderInterface> $builders
31+
*/
32+
public function __construct(array $builders)
3033
{
31-
$this->builders = [
34+
$this->builders = array_merge([
3235
new Builder\AsyncAwsAdapterDefinitionBuilder(),
3336
new Builder\AwsAdapterDefinitionBuilder(),
3437
new Builder\AzureAdapterDefinitionBuilder(),
@@ -40,7 +43,7 @@ public function __construct()
4043
new Builder\SftpAdapterDefinitionBuilder(),
4144
new Builder\WebDAVAdapterDefinitionBuilder(),
4245
new Builder\BunnyCDNAdapterDefinitionBuilder(),
43-
];
46+
], $builders);
4447
}
4548

4649
public function createDefinition(string $name, array $options, ?string $defaultVisibilityForDirectories = null): ?Definition

src/Adapter/Builder/AbstractAdapterDefinitionBuilder.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818

1919
/**
2020
* @author Titouan Galopin <[email protected]>
21-
*
22-
* @internal
2321
*/
2422
abstract class AbstractAdapterDefinitionBuilder implements AdapterDefinitionBuilderInterface
2523
{

src/Adapter/Builder/AdapterDefinitionBuilderInterface.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515

1616
/**
1717
* @author Titouan Galopin <[email protected]>
18-
*
19-
* @internal
2018
*/
2119
interface AdapterDefinitionBuilderInterface
2220
{

src/DependencyInjection/FlysystemExtension.php

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use League\Flysystem\FilesystemWriter;
1818
use League\Flysystem\ReadOnly\ReadOnlyFilesystemAdapter;
1919
use League\FlysystemBundle\Adapter\AdapterDefinitionFactory;
20+
use League\FlysystemBundle\Adapter\Builder\AdapterDefinitionBuilderInterface;
2021
use League\FlysystemBundle\Exception\MissingPackageException;
2122
use League\FlysystemBundle\Lazy\LazyFactory;
2223
use Symfony\Component\DependencyInjection\ContainerBuilder;
@@ -30,6 +31,9 @@
3031
*/
3132
final class FlysystemExtension extends Extension
3233
{
34+
/** @var list<AdapterDefinitionBuilderInterface> */
35+
private array $adapterDefinitionBuilders = [];
36+
3337
public function load(array $configs, ContainerBuilder $container): void
3438
{
3539
$configuration = new Configuration();
@@ -43,9 +47,14 @@ public function load(array $configs, ContainerBuilder $container): void
4347
$this->createStoragesDefinitions($config, $container);
4448
}
4549

50+
public function addAdapterDefinitionBuilder(AdapterDefinitionBuilderInterface $builder): void
51+
{
52+
$this->adapterDefinitionBuilders[] = $builder;
53+
}
54+
4655
private function createStoragesDefinitions(array $config, ContainerBuilder $container): void
4756
{
48-
$definitionFactory = new AdapterDefinitionFactory();
57+
$definitionFactory = new AdapterDefinitionFactory($this->adapterDefinitionBuilders);
4958

5059
foreach ($config['storages'] as $storageName => $storageConfig) {
5160
// If the storage is a lazy one, it's resolved at runtime

tests/Adapter/AdapterDefinitionFactoryTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public function provideConfigOptions(): \Generator
3232
*/
3333
public function testCreateDefinition($name, $options): void
3434
{
35-
$factory = new AdapterDefinitionFactory();
35+
$factory = new AdapterDefinitionFactory([]);
3636

3737
$definition = $factory->createDefinition($name, $options);
3838
$this->assertInstanceOf(Definition::class, $definition);

0 commit comments

Comments
 (0)