• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

liip / LiipImagineBundle / 6284547049

23 Sep 2023 03:28PM UTC coverage: 82.083% (+0.7%) from 81.372%
6284547049

push

github

web-flow
Merge pull request #1531 from liip/2-to-3

2 to 3

19 of 24 new or added lines in 6 files covered. (79.17%)

21 existing lines in 4 files now uncovered.

1860 of 2266 relevant lines covered (82.08%)

67.61 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

98.41
/src/DependencyInjection/Configuration.php
1
<?php
2

3
/*
4
 * This file is part of the `liip/LiipImagineBundle` project.
5
 *
6
 * (c) https://github.com/liip/LiipImagineBundle/graphs/contributors
7
 *
8
 * For the full copyright and license information, please view the LICENSE.md
9
 * file that was distributed with this source code.
10
 */
11

12
namespace Liip\ImagineBundle\DependencyInjection;
13

14
use Liip\ImagineBundle\Config\Controller\ControllerConfig;
15
use Liip\ImagineBundle\Controller\ImagineController;
16
use Liip\ImagineBundle\DependencyInjection\Factory\FactoryInterface;
17
use Liip\ImagineBundle\DependencyInjection\Factory\Loader\LoaderFactoryInterface;
18
use Liip\ImagineBundle\DependencyInjection\Factory\Resolver\ResolverFactoryInterface;
19
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
20
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
21
use Symfony\Component\Config\Definition\ConfigurationInterface;
22
use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
23

24
class Configuration implements ConfigurationInterface
25
{
26
    /**
27
     * @var ResolverFactoryInterface[]
28
     */
29
    protected array $resolversFactories;
30

31
    /**
32
     * @var LoaderFactoryInterface[]
33
     */
34
    protected array $loadersFactories;
35

36
    /**
37
     * @param ResolverFactoryInterface[] $resolversFactories
38
     * @param LoaderFactoryInterface[]   $loadersFactories
39
     */
40
    public function __construct(array $resolversFactories, array $loadersFactories)
41
    {
42
        $this->resolversFactories = $resolversFactories;
192✔
43
        $this->loadersFactories = $loadersFactories;
192✔
44
    }
45

46
    public function getConfigTreeBuilder(): TreeBuilder
47
    {
48
        $treeBuilder = new TreeBuilder('liip_imagine');
184✔
49
        $rootNode = $treeBuilder->getRootNode();
184✔
50

51
        $resolversPrototypeNode = $rootNode
184✔
52
            ->children()
184✔
53
                ->arrayNode('resolvers')
184✔
54
                    ->useAttributeAsKey('name')
184✔
55
                    ->prototype('array')
184✔
56
                        ->performNoDeepMerging();
184✔
57
        $this->addResolversSections($resolversPrototypeNode);
184✔
58

59
        $loadersPrototypeNode = $rootNode
184✔
60
            ->children()
184✔
61
                ->arrayNode('loaders')
184✔
62
                    ->useAttributeAsKey('name')
184✔
63
                    ->prototype('array');
184✔
64
        $this->addLoadersSections($loadersPrototypeNode);
184✔
65

66
        $rootNode
184✔
67
            ->beforeNormalization()
184✔
68
                ->ifTrue(function ($v) {
184✔
69
                    return
176✔
70
                        empty($v['loaders'])
176✔
71
                        || empty($v['loaders']['default'])
176✔
72
                        || empty($v['resolvers'])
176✔
73
                        || empty($v['resolvers']['default']);
176✔
74
                })
184✔
75
                ->then(function ($v) {
184✔
76
                    if (empty($v['loaders'])) {
176✔
77
                        $v['loaders'] = [];
144✔
78
                    }
79

80
                    if (false === \is_array($v['loaders'])) {
176✔
81
                        throw new \LogicException('Loaders has to be array');
8✔
82
                    }
83

84
                    if (false === \array_key_exists('default', $v['loaders'])) {
168✔
85
                        $v['loaders']['default'] = ['filesystem' => null];
160✔
86
                    }
87

88
                    if (empty($v['resolvers'])) {
168✔
89
                        $v['resolvers'] = [];
136✔
90
                    }
91

92
                    if (false === \is_array($v['resolvers'])) {
168✔
93
                        throw new \LogicException('Resolvers has to be array');
8✔
94
                    }
95

96
                    if (false === \array_key_exists('default', $v['resolvers'])) {
160✔
97
                        $v['resolvers']['default'] = ['web_path' => null];
152✔
98
                    }
99

100
                    return $v;
160✔
101
                })
184✔
102
            ->end();
184✔
103

104
        $rootNode
184✔
105
            ->fixXmlConfig('filter_set', 'filter_sets')
184✔
106
            ->children()
184✔
107
                ->scalarNode('driver')->defaultValue('gd')
184✔
108
                    ->validate()
184✔
109
                        ->ifTrue(function ($v) {
184✔
NEW
110
                            return !\in_array($v, ['gd', 'imagick', 'gmagick', 'vips'], true);
×
111
                        })
184✔
112
                        ->thenInvalid('Invalid imagine driver specified: %s')
184✔
113
                    ->end()
184✔
114
                ->end()
184✔
115
                ->scalarNode('cache')->defaultValue('default')->end()
184✔
116
                ->scalarNode('cache_base_path')->defaultValue('')->end()
184✔
117
                ->scalarNode('data_loader')->defaultValue('default')->end()
184✔
118
                ->scalarNode('default_image')->defaultNull()->end()
184✔
119
                ->arrayNode('default_filter_set_settings')
184✔
120
                    ->addDefaultsIfNotSet()
184✔
121
                    ->children()
184✔
122
                        ->scalarNode('quality')->defaultValue(100)->end()
184✔
123
                        ->scalarNode('jpeg_quality')->defaultNull()->end()
184✔
124
                        ->scalarNode('png_compression_level')->defaultNull()->end()
184✔
125
                        ->scalarNode('png_compression_filter')->defaultNull()->end()
184✔
126
                        ->scalarNode('format')->defaultNull()->end()
184✔
127
                        ->booleanNode('animated')->defaultFalse()->end()
184✔
128
                        ->scalarNode('cache')->defaultNull()->end()
184✔
129
                        ->scalarNode('data_loader')->defaultNull()->end()
184✔
130
                        ->scalarNode('default_image')->defaultNull()->end()
184✔
131
                        ->arrayNode('filters')
184✔
132
                            ->useAttributeAsKey('name')
184✔
133
                            ->prototype('array')
184✔
134
                                ->useAttributeAsKey('name')
184✔
135
                                ->ignoreExtraKeys(false)
184✔
136
                                ->prototype('variable')->end()
184✔
137
                            ->end()
184✔
138
                        ->end()
184✔
139
                        ->arrayNode('post_processors')
184✔
140
                            ->defaultValue([])
184✔
141
                            ->useAttributeAsKey('name')
184✔
142
                            ->prototype('array')
184✔
143
                                ->useAttributeAsKey('name')
184✔
144
                                ->ignoreExtraKeys(false)
184✔
145
                                ->prototype('variable')->end()
184✔
146
                            ->end()
184✔
147
                        ->end()
184✔
148
                    ->end()
184✔
149
                ->end()
184✔
150
                ->arrayNode('controller')
184✔
151
                    ->addDefaultsIfNotSet()
184✔
152
                    ->children()
184✔
153
                        ->scalarNode('filter_action')->defaultValue(sprintf('%s::filterAction', ImagineController::class))->end()
184✔
154
                        ->scalarNode('filter_runtime_action')->defaultValue(sprintf('%s::filterRuntimeAction', ImagineController::class))->end()
184✔
155
                        ->integerNode('redirect_response_code')->defaultValue(302)
184✔
156
                            ->validate()
184✔
157
                                ->ifTrue(function ($redirectResponseCode) {
184✔
158
                                    return !\in_array($redirectResponseCode, ControllerConfig::REDIRECT_RESPONSE_CODES, true);
×
159
                                })
184✔
160
                                ->thenInvalid('Invalid redirect response code "%s" (must be 201, 301, 302, 303, 307, or 308).')
184✔
161
                            ->end()
184✔
162
                        ->end()
184✔
163
                    ->end()
184✔
164
                ->end()
184✔
165
                ->arrayNode('filter_sets')
184✔
166
                    ->useAttributeAsKey('name')
184✔
167
                    ->prototype('array')
184✔
168
                        ->fixXmlConfig('filter', 'filters')
184✔
169
                        ->children()
184✔
170
                            ->scalarNode('quality')->end()
184✔
171
                            ->scalarNode('jpeg_quality')->end()
184✔
172
                            ->scalarNode('png_compression_level')->end()
184✔
173
                            ->scalarNode('png_compression_filter')->end()
184✔
174
                            ->scalarNode('format')->end()
184✔
175
                            ->booleanNode('animated')->end()
184✔
176
                            ->scalarNode('cache')->end()
184✔
177
                            ->scalarNode('data_loader')->end()
184✔
178
                            ->scalarNode('default_image')->end()
184✔
179
                            ->arrayNode('filters')
184✔
180
                                ->useAttributeAsKey('name')
184✔
181
                                ->prototype('array')
184✔
182
                                    ->useAttributeAsKey('name')
184✔
183
                                    ->ignoreExtraKeys(false)
184✔
184
                                    ->prototype('variable')->end()
184✔
185
                                ->end()
184✔
186
                            ->end()
184✔
187
                            ->arrayNode('post_processors')
184✔
188
                                ->defaultValue([])
184✔
189
                                ->useAttributeAsKey('name')
184✔
190
                                ->prototype('array')
184✔
191
                                    ->useAttributeAsKey('name')
184✔
192
                                    ->ignoreExtraKeys(false)
184✔
193
                                    ->prototype('variable')->end()
184✔
194
                                ->end()
184✔
195
                        ->end()
184✔
196
                    ->end()
184✔
197
                ->end()
184✔
198
            ->end()
184✔
199
            ->arrayNode('twig')
184✔
200
                ->addDefaultsIfNotSet()
184✔
201
                ->children()
184✔
202
                    ->enumNode('mode')
184✔
203
                        ->defaultValue('lazy')
184✔
204
                        ->info('Twig mode: none/lazy (default)')
184✔
205
                        ->values(['none', 'lazy'])
184✔
206
                    ->end()
184✔
207
                    ->scalarNode('assets_version')->defaultNull()->end()
184✔
208
                ->end()
184✔
209
            ->end()
184✔
210
            ->arrayNode('messenger')
184✔
211
                ->canBeEnabled()
184✔
212
                ->info('Enables integration with symfony/messenger if set true. Warmup image caches in background by sending messages to MQ.')
184✔
213
            ->end()
184✔
214
        ->end();
184✔
215

216
        $rootNode
184✔
217
            ->children()
184✔
218
                ->arrayNode('webp')
184✔
219
                    ->addDefaultsIfNotSet()
184✔
220
                    ->children()
184✔
221
                        ->booleanNode('generate')->defaultFalse()->end()
184✔
222
                        ->integerNode('quality')->defaultValue(100)->end()
184✔
223
                        ->scalarNode('cache')->defaultNull()->end()
184✔
224
                        ->scalarNode('data_loader')->defaultNull()->end()
184✔
225
                        ->arrayNode('post_processors')
184✔
226
                            ->defaultValue([])
184✔
227
                            ->useAttributeAsKey('name')
184✔
228
                            ->prototype('array')
184✔
229
                                ->useAttributeAsKey('name')
184✔
230
                                ->ignoreExtraKeys(false)
184✔
231
                                ->prototype('variable')->end()
184✔
232
                            ->end()
184✔
233
                    ->end()
184✔
234
                ->end()
184✔
235
            ->end();
184✔
236

237
        return $treeBuilder;
184✔
238
    }
239

240
    private function addResolversSections(ArrayNodeDefinition $resolversPrototypeNode): void
241
    {
242
        $this->addConfigurationSections($this->resolversFactories, $resolversPrototypeNode, 'resolver');
184✔
243
    }
244

245
    private function addLoadersSections(ArrayNodeDefinition $resolversPrototypeNode): void
246
    {
247
        $this->addConfigurationSections($this->loadersFactories, $resolversPrototypeNode, 'loader');
184✔
248
    }
249

250
    /**
251
     * @param FactoryInterface[] $factories
252
     */
253
    private function addConfigurationSections(array $factories, ArrayNodeDefinition $definition, string $type): void
254
    {
255
        foreach ($factories as $f) {
184✔
256
            $f->addConfiguration($definition->children()->arrayNode($f->getName()));
176✔
257
        }
258

259
        $nodeDefinition = $definition->end();
184✔
260

261
        \assert($nodeDefinition instanceof ArrayNodeDefinition);
262

263
        $nodeDefinition
184✔
264
            ->validate()
184✔
265
            ->ifTrue(function ($array) use ($type) {
184✔
266
                foreach ($array as $name => $element) {
152✔
267
                    if (!$element) {
152✔
268
                        throw new InvalidConfigurationException(ucfirst($type).' "'.$name.'" must have a factory configured');
×
269
                    }
270
                }
271

272
                return false;
152✔
273
            })
184✔
274
            ->thenInvalid('Each '.$type.' must have a factory configured')
184✔
275
            ->end();
184✔
276
    }
277
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc