vendor/liip/imagine-bundle/DependencyInjection/LiipImagineExtension.php line 61

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the `liip/LiipImagineBundle` project.
  4.  *
  5.  * (c) https://github.com/liip/LiipImagineBundle/graphs/contributors
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE.md
  8.  * file that was distributed with this source code.
  9.  */
  10. namespace Liip\ImagineBundle\DependencyInjection;
  11. use Imagine\Vips\Imagine;
  12. use Liip\ImagineBundle\DependencyInjection\Factory\Loader\LoaderFactoryInterface;
  13. use Liip\ImagineBundle\DependencyInjection\Factory\Resolver\ResolverFactoryInterface;
  14. use Liip\ImagineBundle\Imagine\Cache\CacheManager;
  15. use Liip\ImagineBundle\Imagine\Data\DataManager;
  16. use Liip\ImagineBundle\Imagine\Filter\FilterManager;
  17. use Symfony\Component\Config\Definition\ConfigurationInterface;
  18. use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
  19. use Symfony\Component\Config\FileLocator;
  20. use Symfony\Component\DependencyInjection\Alias;
  21. use Symfony\Component\DependencyInjection\ContainerBuilder;
  22. use Symfony\Component\DependencyInjection\Definition;
  23. use Symfony\Component\DependencyInjection\Exception\LogicException;
  24. use Symfony\Component\DependencyInjection\Extension\Extension;
  25. use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
  26. use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
  27. use Symfony\Component\Messenger\MessageBusInterface;
  28. use Symfony\Component\Mime\MimeTypeGuesserInterface;
  29. use Symfony\Component\Mime\MimeTypes;
  30. class LiipImagineExtension extends Extension implements PrependExtensionInterface
  31. {
  32.     /**
  33.      * @var ResolverFactoryInterface[]
  34.      */
  35.     private $resolversFactories = [];
  36.     /**
  37.      * @var LoaderFactoryInterface[]
  38.      */
  39.     private $loadersFactories = [];
  40.     public function addResolverFactory(ResolverFactoryInterface $resolverFactory)
  41.     {
  42.         $this->resolversFactories[$resolverFactory->getName()] = $resolverFactory;
  43.     }
  44.     public function addLoaderFactory(LoaderFactoryInterface $loaderFactory)
  45.     {
  46.         $this->loadersFactories[$loaderFactory->getName()] = $loaderFactory;
  47.     }
  48.     public function getConfiguration(array $configContainerBuilder $container): ?ConfigurationInterface
  49.     {
  50.         return new Configuration($this->resolversFactories$this->loadersFactories);
  51.     }
  52.     /**
  53.      * @see \Symfony\Component\DependencyInjection\Extension.ExtensionInterface::load()
  54.      */
  55.     public function load(array $configsContainerBuilder $container): void
  56.     {
  57.         $config $this->processConfiguration(
  58.             $this->getConfiguration($configs$container),
  59.             $configs
  60.         );
  61.         if (interface_exists(MimeTypeGuesserInterface::class)) {
  62.             $mimeTypes = new Definition(MimeTypes::class);
  63.             $mimeTypes->setFactory([MimeTypes::class, 'getDefault']);
  64.             $container->setDefinition('liip_imagine.mime_types'$mimeTypes);
  65.         }
  66.         $container->setParameter('liip_imagine.resolvers'$config['resolvers']);
  67.         $container->setParameter('liip_imagine.loaders'$config['loaders']);
  68.         $this->loadResolvers($config['resolvers'], $container);
  69.         $this->loadLoaders($config['loaders'], $container);
  70.         $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
  71.         $loader->load('imagine.xml');
  72.         if ('none' !== $config['twig']['mode']) {
  73.             $this->loadTwig($config['twig'], $loader$container);
  74.         }
  75.         $loader->load('commands.xml');
  76.         if ($this->isConfigEnabled($container$config['messenger'])) {
  77.             $this->registerMessengerConfiguration($loader);
  78.         }
  79.         if ($config['enqueue']) {
  80.             $loader->load('enqueue.xml');
  81.         }
  82.         if ($config['templating']) {
  83.             $loader->load('templating.xml');
  84.         }
  85.         $driver $config['driver'];
  86.         if ('vips' === $driver) {
  87.             if (!class_exists(Imagine::class)) {
  88.                 $vipsImagineClass Imagine::class;
  89.                 throw new \RuntimeException("Unable to use 'vips' driver without '{$vipsImagineClass}' class.");
  90.             }
  91.             $loader->load('imagine_vips.xml');
  92.         }
  93.         $container->setParameter('liip_imagine.driver_service'"liip_imagine.{$driver}");
  94.         $container
  95.             ->getDefinition('liip_imagine.controller.config')
  96.             ->replaceArgument(0$config['controller']['redirect_response_code']);
  97.         $container->setAlias('liip_imagine', new Alias("liip_imagine.{$driver}"));
  98.         $container->setAlias(CacheManager::class, new Alias('liip_imagine.cache.manager'false));
  99.         $container->setAlias(DataManager::class, new Alias('liip_imagine.data.manager'false));
  100.         $container->setAlias(FilterManager::class, new Alias('liip_imagine.filter.manager'false));
  101.         $container->setParameter('liip_imagine.cache.resolver.default'$config['cache']);
  102.         $container->setParameter('liip_imagine.default_image'$config['default_image']);
  103.         $filterSets $this->createFilterSets($config['default_filter_set_settings'], $config['filter_sets']);
  104.         $container->setParameter('liip_imagine.filter_sets'$filterSets);
  105.         $container->setParameter('liip_imagine.binary.loader.default'$config['data_loader']);
  106.         $container->setParameter('liip_imagine.controller.filter_action'$config['controller']['filter_action']);
  107.         $container->setParameter('liip_imagine.controller.filter_runtime_action'$config['controller']['filter_runtime_action']);
  108.         if ($container->hasDefinition('liip_imagine.mime_types')) {
  109.             $mimeTypes $container->getDefinition('liip_imagine.mime_types');
  110.             $container->getDefinition('liip_imagine.binary.mime_type_guesser')
  111.                 ->replaceArgument(0$mimeTypes);
  112.             $container->getDefinition('liip_imagine.data.manager')
  113.                 ->replaceArgument(1$mimeTypes);
  114.         }
  115.         $this->deprecationTemplatingFilterHelper($container);
  116.         $container->setParameter('liip_imagine.webp.generate'$config['webp']['generate']);
  117.         $webpOptions $config['webp'];
  118.         unset($webpOptions['generate']);
  119.         $container->setParameter('liip_imagine.webp.options'$webpOptions);
  120.     }
  121.     public function prepend(ContainerBuilder $container): void
  122.     {
  123.         if ($container->hasExtension('twig')) {
  124.             $container->prependExtensionConfig('twig', ['form_themes' => ['@LiipImagine/Form/form_div_layout.html.twig']]);
  125.         }
  126.     }
  127.     private function createFilterSets(array $defaultFilterSets, array $filterSets): array
  128.     {
  129.         return array_map(function (array $filterSet) use ($defaultFilterSets) {
  130.             return array_replace_recursive($defaultFilterSets$filterSet);
  131.         }, $filterSets);
  132.     }
  133.     private function loadResolvers(array $configContainerBuilder $container)
  134.     {
  135.         $this->createFactories($this->resolversFactories$config$container);
  136.     }
  137.     private function loadLoaders(array $configContainerBuilder $container)
  138.     {
  139.         $this->createFactories($this->loadersFactories$config$container);
  140.     }
  141.     private function createFactories(array $factories, array $configurationsContainerBuilder $container)
  142.     {
  143.         foreach ($configurations as $name => $conf) {
  144.             $factories[key($conf)]->create($container$name$conf[key($conf)]);
  145.         }
  146.     }
  147.     private function registerMessengerConfiguration(XmlFileLoader $loader): void
  148.     {
  149.         if (!interface_exists(MessageBusInterface::class)) {
  150.             throw new LogicException('Messenger support cannot be enabled as the Messenger component is not installed. Try running "composer require symfony/messenger".');
  151.         }
  152.         $loader->load('messenger.xml');
  153.     }
  154.     private function deprecationTemplatingFilterHelper(ContainerBuilder $container): void
  155.     {
  156.         if (!$container->hasDefinition('liip_imagine.templating.filter_helper')) {
  157.             return;
  158.         }
  159.         $message 'The "%service_id%" service is deprecated since LiipImagineBundle 2.2 and will be removed in 3.0.';
  160.         $definition $container->getDefinition('liip_imagine.templating.filter_helper');
  161.         if (method_exists(Definition::class, 'getDeprecation')) {
  162.             $definition->setDeprecated('liip/imagine-bundle''2.2'$message);
  163.         } else {
  164.             $definition->setDeprecated(true$message);
  165.         }
  166.     }
  167.     private function loadTwig(array $configXmlFileLoader $loaderContainerBuilder $container): void
  168.     {
  169.         if ('legacy' === $config['mode']) {
  170.             $loader->load('imagine_twig_mode_legacy.xml');
  171.             return;
  172.         }
  173.         if ('lazy' === $config['mode']) {
  174.             $loader->load('imagine_twig_mode_lazy.xml');
  175.             if (\array_key_exists('assets_version'$config) && null !== $config['assets_version']) {
  176.                 $runtime $container->getDefinition('liip_imagine.templating.filter_runtime');
  177.                 $runtime->setArgument(1$config['assets_version']);
  178.             }
  179.             return;
  180.         }
  181.         throw new InvalidConfigurationException('Unexpected twig mode '.$config['mode']);
  182.     }
  183. }