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

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 $configsContainerBuilder $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 $configContainerBuilder $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 $configContainerBuilder $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 $configContainerBuilder $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 $configContainerBuilder $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($idFilesystemInterface::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 $filesystemsLoader\XmlFileLoader $loaderContainerBuilder $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. }