vendor/oneup/flysystem-bundle/DependencyInjection/OneupFlysystemExtension.php line 53

Open in your IDE?
  1. <?php
  2. namespace Oneup\FlysystemBundle\DependencyInjection;
  3. use League\Flysystem\FilesystemInterface;
  4. use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
  5. use Symfony\Component\Config\FileLocator;
  6. use Symfony\Component\DependencyInjection\Loader;
  7. use Symfony\Component\DependencyInjection\ContainerBuilder;
  8. use Symfony\Component\DependencyInjection\ChildDefinition;
  9. use Symfony\Component\DependencyInjection\Reference;
  10. use Symfony\Component\HttpKernel\DependencyInjection\Extension;
  11. class OneupFlysystemExtension extends Extension
  12. {
  13. private $adapterFactories;
  14. private $cacheFactories;
  15. public function load(array $configs, ContainerBuilder $container)
  16. {
  17. $loader = new Loader\XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
  18. $loader->load('factories.xml');
  19. list($adapterFactories, $cacheFactories) = $this->getFactories($container);
  20. $configuration = new Configuration($adapterFactories, $cacheFactories);
  21. $config = $this->processConfiguration($configuration, $configs);
  22. $loader->load('adapters.xml');
  23. $loader->load('flysystem.xml');
  24. $loader->load('cache.xml');
  25. $loader->load('plugins.xml');
  26. $adapters = array();
  27. $filesystems = array();
  28. $caches = array();
  29. foreach ($config['adapters'] as $name => $adapter) {
  30. $adapters[$name] = $this->createAdapter($name, $adapter, $container, $adapterFactories);
  31. }
  32. foreach ($config['cache'] as $name => $cache) {
  33. $caches[$name] = $this->createCache($name, $cache, $container, $cacheFactories);
  34. }
  35. foreach ($config['filesystems'] as $name => $filesystem) {
  36. $filesystems[$name] = $this->createFilesystem($name, $filesystem, $container, $adapters, $caches);
  37. }
  38. $this->loadStreamWrappers($config['filesystems'], $filesystems, $loader, $container);
  39. }
  40. public function getConfiguration(array $config, ContainerBuilder $container)
  41. {
  42. $loader = new Loader\XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
  43. $loader->load('factories.xml');
  44. list($adapterFactories, $cacheFactories) = $this->getFactories($container);
  45. return new Configuration($adapterFactories, $cacheFactories);
  46. }
  47. private function createCache($name, array $config, ContainerBuilder $container, array $factories)
  48. {
  49. foreach ($config as $key => $adapter) {
  50. if (array_key_exists($key, $factories)) {
  51. $id = sprintf('oneup_flysystem.%s_cache', $name);
  52. $factories[$key]->create($container, $id, $adapter);
  53. return $id;
  54. }
  55. }
  56. throw new \LogicException(sprintf('The cache \'%s\' is not configured.', $name));
  57. }
  58. private function createAdapter($name, array $config, ContainerBuilder $container, array $factories)
  59. {
  60. foreach ($config as $key => $adapter) {
  61. if (array_key_exists($key, $factories)) {
  62. $id = sprintf('oneup_flysystem.%s_adapter', $name);
  63. $factories[$key]->create($container, $id, $adapter);
  64. return $id;
  65. }
  66. }
  67. throw new \LogicException(sprintf('The adapter \'%s\' is not configured.', $name));
  68. }
  69. private function createFilesystem($name, array $config, ContainerBuilder $container, array $adapters, array $caches)
  70. {
  71. if (!array_key_exists($config['adapter'], $adapters)) {
  72. throw new \LogicException(sprintf('The adapter \'%s\' is not defined.', $config['adapter']));
  73. }
  74. $adapter = $adapters[$config['adapter']];
  75. $id = sprintf('oneup_flysystem.%s_filesystem', $name);
  76. $cache = null;
  77. if (array_key_exists($config['cache'], $caches)) {
  78. $cache = $caches[$config['cache']];
  79. $container
  80. ->setDefinition($adapter.'_cached', new ChildDefinition('oneup_flysystem.adapter.cached'))
  81. ->replaceArgument(0, new Reference($adapter))
  82. ->replaceArgument(1, new Reference($cache));
  83. }
  84. $tagParams = array('key' => $name);
  85. if ($config['mount']) {
  86. $tagParams['mount'] = $config['mount'];
  87. }
  88. $options = [];
  89. if (array_key_exists('visibility', $config)) {
  90. $options['visibility'] = $config['visibility'];
  91. }
  92. if (array_key_exists('disable_asserts', $config)) {
  93. $options['disable_asserts'] = $config['disable_asserts'];
  94. }
  95. $container
  96. ->setDefinition($id, new ChildDefinition('oneup_flysystem.filesystem'))
  97. ->replaceArgument(0, new Reference($cache ? $adapter.'_cached' : $adapter))
  98. ->replaceArgument(1, $options)
  99. ->addTag('oneup_flysystem.filesystem', $tagParams)
  100. ->setPublic(true)
  101. ;
  102. if (!empty($config['alias'])) {
  103. $container->getDefinition($id)->setPublic(false);
  104. if (null === $alias = $container->setAlias($config['alias'], $id)) {
  105. $alias = $container->getAlias($config['alias']);
  106. }
  107. $alias->setPublic(true);
  108. }
  109. // Attach Plugins
  110. $defFilesystem = $container->getDefinition($id);
  111. if (isset($config['plugins']) && is_array($config['plugins'])) {
  112. foreach ($config['plugins'] as $pluginId) {
  113. $defFilesystem->addMethodCall('addPlugin', array(new Reference($pluginId)));
  114. }
  115. }
  116. if (method_exists($container, 'registerAliasForArgument')) {
  117. $aliasName = $name;
  118. if (!preg_match('~filesystem$~i', $aliasName)) {
  119. $aliasName .= 'Filesystem';
  120. }
  121. $container->registerAliasForArgument($id, FilesystemInterface::class, $aliasName)->setPublic(false);
  122. }
  123. return new Reference($id);
  124. }
  125. private function getFactories(ContainerBuilder $container)
  126. {
  127. return array(
  128. $this->getAdapterFactories($container),
  129. $this->getCacheFactories($container),
  130. );
  131. }
  132. private function getAdapterFactories(ContainerBuilder $container)
  133. {
  134. if (null !== $this->adapterFactories) {
  135. return $this->adapterFactories;
  136. }
  137. $factories = array();
  138. $services = $container->findTaggedServiceIds('oneup_flysystem.adapter_factory');
  139. foreach (array_keys($services) as $id) {
  140. $factory = $container->get($id);
  141. $factories[str_replace('-', '_', $factory->getKey())] = $factory;
  142. }
  143. return $this->adapterFactories = $factories;
  144. }
  145. private function getCacheFactories(ContainerBuilder $container)
  146. {
  147. if (null !== $this->cacheFactories) {
  148. return $this->cacheFactories;
  149. }
  150. $factories = array();
  151. $services = $container->findTaggedServiceIds('oneup_flysystem.cache_factory');
  152. foreach (array_keys($services) as $id) {
  153. $factory = $container->get($id);
  154. $factories[str_replace('-', '_', $factory->getKey())] = $factory;
  155. }
  156. return $this->cacheFactories = $factories;
  157. }
  158. /**
  159. * @param array $configs
  160. * @param Reference[] $filesystems
  161. * @param Loader\XmlFileLoader $loader
  162. * @param ContainerBuilder $container
  163. */
  164. private function loadStreamWrappers(array $configs, array $filesystems, Loader\XmlFileLoader $loader, ContainerBuilder $container)
  165. {
  166. if (!$this->hasStreamWrapperConfiguration($configs)) {
  167. return;
  168. }
  169. if (!class_exists('Twistor\FlysystemStreamWrapper')) {
  170. throw new InvalidConfigurationException('twistor/flysystem-stream-wrapper must be installed to use the stream wrapper feature.');
  171. }
  172. $loader->load('stream_wrappers.xml');
  173. $configurations = [];
  174. foreach ($configs as $name => $filesystem) {
  175. if (!isset($filesystem['stream_wrapper'])) {
  176. continue;
  177. }
  178. $streamWrapper = array_merge(['configuration' => null], $filesystem['stream_wrapper']);
  179. $configuration = new ChildDefinition('oneup_flysystem.stream_wrapper.configuration.def');
  180. $configuration
  181. ->replaceArgument(0, $streamWrapper['protocol'])
  182. ->replaceArgument(1, $filesystems[$name])
  183. ->replaceArgument(2, $streamWrapper['configuration'])
  184. ->setPublic(false);
  185. $container->setDefinition('oneup_flysystem.stream_wrapper.configuration.'.$name, $configuration);
  186. $configurations[$name] = new Reference('oneup_flysystem.stream_wrapper.configuration.'.$name);
  187. }
  188. $container->getDefinition('oneup_flysystem.stream_wrapper.manager')->replaceArgument(0, $configurations);
  189. }
  190. /**
  191. * @param array $configs
  192. *
  193. * @return bool
  194. */
  195. private function hasStreamWrapperConfiguration(array $configs)
  196. {
  197. foreach ($configs as $name => $filesystem) {
  198. if (isset($filesystem['stream_wrapper'])) {
  199. return true;
  200. }
  201. }
  202. return false;
  203. }
  204. }