vendor/liip/imagine-bundle/DependencyInjection/Configuration.php line 208

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 Liip\ImagineBundle\Config\Controller\ControllerConfig;
  12. use Liip\ImagineBundle\Controller\ImagineController;
  13. use Liip\ImagineBundle\DependencyInjection\Factory\Loader\LoaderFactoryInterface;
  14. use Liip\ImagineBundle\DependencyInjection\Factory\Resolver\ResolverFactoryInterface;
  15. use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
  16. use Symfony\Component\Config\Definition\Builder\TreeBuilder;
  17. use Symfony\Component\Config\Definition\ConfigurationInterface;
  18. class Configuration implements ConfigurationInterface
  19. {
  20.     /**
  21.      * @var ResolverFactoryInterface[]
  22.      */
  23.     protected $resolversFactories;
  24.     /**
  25.      * @var LoaderFactoryInterface[]
  26.      */
  27.     protected $loadersFactories;
  28.     /**
  29.      * @param ResolverFactoryInterface[] $resolversFactories
  30.      * @param LoaderFactoryInterface[]   $loadersFactories
  31.      */
  32.     public function __construct(array $resolversFactories, array $loadersFactories)
  33.     {
  34.         $this->resolversFactories $resolversFactories;
  35.         $this->loadersFactories $loadersFactories;
  36.     }
  37.     /**
  38.      * {@inheritdoc}
  39.      */
  40.     public function getConfigTreeBuilder()
  41.     {
  42.         $treeBuilder = new TreeBuilder('liip_imagine');
  43.         $rootNode method_exists(TreeBuilder::class, 'getRootNode')
  44.             ? $treeBuilder->getRootNode()
  45.             : $treeBuilder->root('liip_imagine');
  46.         $resolversPrototypeNode $rootNode
  47.             ->children()
  48.                 ->arrayNode('resolvers')
  49.                     ->useAttributeAsKey('name')
  50.                     ->prototype('array')
  51.                         ->performNoDeepMerging();
  52.         $this->addResolversSections($resolversPrototypeNode);
  53.         $loadersPrototypeNode $rootNode
  54.             ->children()
  55.                 ->arrayNode('loaders')
  56.                     ->useAttributeAsKey('name')
  57.                     ->prototype('array');
  58.         $this->addLoadersSections($loadersPrototypeNode);
  59.         $rootNode
  60.             ->beforeNormalization()
  61.                 ->ifTrue(function ($v) {
  62.                     return
  63.                         empty($v['loaders']) ||
  64.                         empty($v['loaders']['default']) ||
  65.                         empty($v['resolvers']) ||
  66.                         empty($v['resolvers']['default']);
  67.                 })
  68.                 ->then(function ($v) {
  69.                     if (empty($v['loaders'])) {
  70.                         $v['loaders'] = [];
  71.                     }
  72.                     if (false === \is_array($v['loaders'])) {
  73.                         throw new \LogicException('Loaders has to be array');
  74.                     }
  75.                     if (false === \array_key_exists('default'$v['loaders'])) {
  76.                         $v['loaders']['default'] = ['filesystem' => null];
  77.                     }
  78.                     if (empty($v['resolvers'])) {
  79.                         $v['resolvers'] = [];
  80.                     }
  81.                     if (false === \is_array($v['resolvers'])) {
  82.                         throw new \LogicException('Resolvers has to be array');
  83.                     }
  84.                     if (false === \array_key_exists('default'$v['resolvers'])) {
  85.                         $v['resolvers']['default'] = ['web_path' => null];
  86.                     }
  87.                     return $v;
  88.                 })
  89.             ->end();
  90.         $rootNode
  91.             ->fixXmlConfig('filter_set''filter_sets')
  92.             ->children()
  93.                 ->scalarNode('driver')->defaultValue('gd')
  94.                     ->validate()
  95.                         ->ifTrue(function ($v) {
  96.                             return !\in_array($v, ['gd''imagick''gmagick'], true);
  97.                         })
  98.                         ->thenInvalid('Invalid imagine driver specified: %s')
  99.                     ->end()
  100.                 ->end()
  101.                 ->scalarNode('cache')->defaultValue('default')->end()
  102.                 ->scalarNode('cache_base_path')->defaultValue('')->end()
  103.                 ->scalarNode('data_loader')->defaultValue('default')->end()
  104.                 ->scalarNode('default_image')->defaultNull()->end()
  105.                 ->arrayNode('default_filter_set_settings')
  106.                     ->addDefaultsIfNotSet()
  107.                     ->children()
  108.                         ->scalarNode('quality')->defaultValue(100)->end()
  109.                         ->scalarNode('jpeg_quality')->defaultNull()->end()
  110.                         ->scalarNode('png_compression_level')->defaultNull()->end()
  111.                         ->scalarNode('png_compression_filter')->defaultNull()->end()
  112.                         ->scalarNode('format')->defaultNull()->end()
  113.                         ->booleanNode('animated')->defaultFalse()->end()
  114.                         ->scalarNode('cache')->defaultNull()->end()
  115.                         ->scalarNode('data_loader')->defaultNull()->end()
  116.                         ->scalarNode('default_image')->defaultNull()->end()
  117.                         ->arrayNode('filters')
  118.                             ->useAttributeAsKey('name')
  119.                             ->prototype('array')
  120.                                 ->useAttributeAsKey('name')
  121.                                 ->prototype('variable')->end()
  122.                             ->end()
  123.                         ->end()
  124.                         ->arrayNode('post_processors')
  125.                             ->defaultValue([])
  126.                             ->useAttributeAsKey('name')
  127.                             ->prototype('array')
  128.                                 ->useAttributeAsKey('name')
  129.                                 ->prototype('variable')->end()
  130.                             ->end()
  131.                         ->end()
  132.                     ->end()
  133.                 ->end()
  134.                 ->arrayNode('controller')
  135.                     ->addDefaultsIfNotSet()
  136.                     ->children()
  137.                         ->scalarNode('filter_action')->defaultValue(sprintf('%s::filterAction'ImagineController::class))->end()
  138.                         ->scalarNode('filter_runtime_action')->defaultValue(sprintf('%s::filterRuntimeAction'ImagineController::class))->end()
  139.                         ->integerNode('redirect_response_code')->defaultValue(301)
  140.                             ->validate()
  141.                                 ->ifTrue(function ($redirectResponseCode) {
  142.                                     return !\in_array($redirectResponseCodeControllerConfig::REDIRECT_RESPONSE_CODEStrue);
  143.                                 })
  144.                                 ->thenInvalid('Invalid redirect response code "%s" (must be 201, 301, 302, 303, 307, or 308).')
  145.                             ->end()
  146.                         ->end()
  147.                     ->end()
  148.                 ->end()
  149.                 ->arrayNode('filter_sets')
  150.                     ->useAttributeAsKey('name')
  151.                     ->prototype('array')
  152.                         ->fixXmlConfig('filter''filters')
  153.                         ->children()
  154.                             ->scalarNode('quality')->end()
  155.                             ->scalarNode('jpeg_quality')->end()
  156.                             ->scalarNode('png_compression_level')->end()
  157.                             ->scalarNode('png_compression_filter')->end()
  158.                             ->scalarNode('format')->end()
  159.                             ->booleanNode('animated')->end()
  160.                             ->scalarNode('cache')->end()
  161.                             ->scalarNode('data_loader')->end()
  162.                             ->scalarNode('default_image')->end()
  163.                             ->arrayNode('filters')
  164.                                 ->useAttributeAsKey('name')
  165.                                 ->prototype('array')
  166.                                     ->useAttributeAsKey('name')
  167.                                     ->prototype('variable')->end()
  168.                                 ->end()
  169.                             ->end()
  170.                             ->arrayNode('post_processors')
  171.                                 ->defaultValue([])
  172.                                 ->useAttributeAsKey('name')
  173.                                 ->prototype('array')
  174.                                     ->useAttributeAsKey('name')
  175.                                     ->prototype('variable')->end()
  176.                                 ->end()
  177.                         ->end()
  178.                     ->end()
  179.                 ->end()
  180.             ->end()
  181.             ->booleanNode('enqueue')
  182.                 ->defaultFalse()
  183.                 ->info('Enables integration with enqueue if set true. Allows resolve image caches in background by sending messages to MQ.')
  184.             ->end()
  185.             ->booleanNode('templating')
  186.                 ->defaultTrue()
  187.                 ->info('Enables integration with symfony/templating component')
  188.                 ->validate()
  189.                     ->ifTrue()
  190.                     ->then(function ($v) {
  191.                         @trigger_error('Symfony templating integration has been deprecated since LiipImagineBundle 2.2 and will be removed in 3.0. Use Twig and use "false" as "liip_imagine.templating" value instead.'E_USER_DEPRECATED);
  192.                         return $v;
  193.                     })
  194.                 ->end()
  195.             ->end()
  196.         ->end();
  197.         $rootNode
  198.             ->children()
  199.                 ->arrayNode('webp')
  200.                     ->addDefaultsIfNotSet()
  201.                     ->children()
  202.                         ->booleanNode('generate')->defaultFalse()->end()
  203.                         ->integerNode('quality')->defaultValue(100)->end()
  204.                         ->scalarNode('cache')->defaultNull()->end()
  205.                         ->scalarNode('data_loader')->defaultNull()->end()
  206.                         ->arrayNode('post_processors')
  207.                             ->defaultValue([])
  208.                             ->useAttributeAsKey('name')
  209.                             ->prototype('array')
  210.                                 ->useAttributeAsKey('name')
  211.                                 ->prototype('variable')->end()
  212.                             ->end()
  213.                     ->end()
  214.                 ->end()
  215.             ->end();
  216.         return $treeBuilder;
  217.     }
  218.     private function addResolversSections(ArrayNodeDefinition $resolversPrototypeNode)
  219.     {
  220.         $this->addConfigurationSections($this->resolversFactories$resolversPrototypeNode);
  221.     }
  222.     private function addLoadersSections(ArrayNodeDefinition $resolversPrototypeNode)
  223.     {
  224.         $this->addConfigurationSections($this->loadersFactories$resolversPrototypeNode);
  225.     }
  226.     private function addConfigurationSections(array $factoriesArrayNodeDefinition $definition)
  227.     {
  228.         foreach ($factories as $f) {
  229.             $f->addConfiguration($definition->children()->arrayNode($f->getName()));
  230.         }
  231.     }
  232. }