1515use League \Flysystem \FilesystemInterface ;
1616use League \Flysystem \PluginInterface ;
1717use League \FlysystemBundle \Adapter \AdapterDefinitionFactory ;
18+ use League \FlysystemBundle \Lazy \LazyFactory ;
1819use Symfony \Component \DependencyInjection \ContainerBuilder ;
1920use Symfony \Component \DependencyInjection \Definition ;
2021use Symfony \Component \DependencyInjection \Reference ;
2122use Symfony \Component \HttpKernel \DependencyInjection \Extension ;
23+ use Symfony \Component \OptionsResolver \OptionsResolver ;
2224
2325/**
2426 * @author Titouan Galopin <galopintitouan@gmail.com>
@@ -32,31 +34,67 @@ public function load(array $configs, ContainerBuilder $container)
3234 $ configuration = new Configuration ();
3335 $ config = $ this ->processConfiguration ($ configuration , $ configs );
3436
35- $ adapterFactory = new AdapterDefinitionFactory ();
36-
3737 $ container
3838 ->registerForAutoconfiguration (PluginInterface::class)
3939 ->addTag ('flysystem.plugin ' )
4040 ;
4141
42+ $ container
43+ ->setDefinition ('flysystem.adapter.lazy.factory ' , new Definition (LazyFactory::class))
44+ ->setPublic (false )
45+ ;
46+
47+ $ this ->createStoragesDefinitions ($ config , $ container );
48+ }
49+
50+ private function createStoragesDefinitions (array $ config , ContainerBuilder $ container )
51+ {
52+ $ definitionFactory = new AdapterDefinitionFactory ();
53+
4254 foreach ($ config ['storages ' ] as $ storageName => $ storageConfig ) {
43- // Create adapter service definition
44- if ($ adapter = $ adapterFactory ->createDefinition ($ storageConfig ['adapter ' ], $ storageConfig ['options ' ])) {
55+ // If the storage is a lazy one, it's resolved at runtime
56+ if ('lazy ' === $ storageConfig ['adapter ' ]) {
57+ $ container ->setDefinition ($ storageName , $ this ->createLazyStorageDefinition ($ storageName , $ storageConfig ['options ' ]));
58+
59+ continue ;
60+ }
61+
62+ // Create adapter definition
63+ if ($ adapter = $ definitionFactory ->createDefinition ($ storageConfig ['adapter ' ], $ storageConfig ['options ' ])) {
4564 // Native adapter
4665 $ container ->setDefinition ('flysystem.adapter. ' .$ storageName , $ adapter )->setPublic (false );
4766 } else {
4867 // Custom adapter
4968 $ container ->setAlias ('flysystem.adapter. ' .$ storageName , $ storageConfig ['adapter ' ])->setPublic (false );
5069 }
5170
52- // Create storage service definition
53- $ definition = $ this ->createStorageDefinition ($ storageName , new Reference ('flysystem.adapter. ' .$ storageName ), $ storageConfig );
71+ // Create storage definition
72+ $ container ->setDefinition (
73+ $ storageName ,
74+ $ this ->createStorageDefinition ($ storageName , new Reference ('flysystem.adapter. ' .$ storageName ), $ storageConfig )
75+ );
5476
55- $ container -> setDefinition ( $ storageName , $ definition );
77+ // Register named autowiring alias
5678 $ container ->registerAliasForArgument ($ storageName , FilesystemInterface::class, $ storageName )->setPublic (false );
5779 }
5880 }
5981
82+ private function createLazyStorageDefinition (string $ storageName , array $ options )
83+ {
84+ $ resolver = new OptionsResolver ();
85+ $ resolver ->setRequired ('source ' );
86+ $ resolver ->setAllowedTypes ('source ' , 'string ' );
87+
88+ $ definition = new Definition (FilesystemInterface::class);
89+ $ definition ->setPublic (false );
90+ $ definition ->setFactory ([new Reference ('flysystem.adapter.lazy.factory ' ), 'createStorage ' ]);
91+ $ definition ->setArgument (0 , $ resolver ->resolve ($ options )['source ' ]);
92+ $ definition ->setArgument (1 , $ storageName );
93+ $ definition ->addTag ('flysystem.storage ' , ['storage ' => $ storageName ]);
94+
95+ return $ definition ;
96+ }
97+
6098 private function createStorageDefinition (string $ storageName , Reference $ adapter , array $ config )
6199 {
62100 $ definition = new Definition (Filesystem::class);
0 commit comments