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

tito10047 / progressive-image-bundle / 20693128959

04 Jan 2026 12:47PM UTC coverage: 89.651%. Remained the same
20693128959

push

github

tito10047
fix: adjust indentation and spacing across multiple files for consistent styling and alignment

1 of 1 new or added line in 1 file covered. (100.0%)

121 existing lines in 9 files now uncovered.

693 of 773 relevant lines covered (89.65%)

249.82 hits per line

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

80.29
/src/DependencyInjection/ProgressiveImageExtension.php
1
<?php
2

3
/*
4
 * This file is part of the Progressive Image Bundle.
5
 *
6
 * (c) Jozef Môstka <https://github.com/tito10047/progressive-image-bundle>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11

12
namespace Tito10047\ProgressiveImageBundle\DependencyInjection;
13

14
use Liip\ImagineBundle\LiipImagineBundle;
15
use Symfony\Component\Config\FileLocator;
16
use Symfony\Component\DependencyInjection\ContainerBuilder;
17
use Symfony\Component\DependencyInjection\Extension\Extension;
18
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
19
use Symfony\Component\DependencyInjection\Loader\PhpFileLoader;
20
use Symfony\Component\DependencyInjection\Parameter;
21
use Symfony\Component\DependencyInjection\Reference;
22
use Tito10047\ProgressiveImageBundle\Event\TransparentImageCacheSubscriber;
23
use Tito10047\ProgressiveImageBundle\Resolver\AssetMapperResolver;
24
use Tito10047\ProgressiveImageBundle\Resolver\ChainResolver;
25
use Tito10047\ProgressiveImageBundle\Resolver\FileSystemResolver;
26
use Tito10047\ProgressiveImageBundle\Service\LiipImagineRuntimeConfigGenerator;
27
use Tito10047\ProgressiveImageBundle\Service\MetadataReader;
28
use Tito10047\ProgressiveImageBundle\Service\PreloadCollector;
29
use Tito10047\ProgressiveImageBundle\Service\ResponsiveAttributeGenerator;
30
use Tito10047\ProgressiveImageBundle\Twig\Components\Image;
31
use Tito10047\ProgressiveImageBundle\Twig\TransparentCacheExtension;
32
use Tito10047\ProgressiveImageBundle\UrlGenerator\LiipImagineResponsiveImageUrlGenerator;
33
use Tito10047\ProgressiveImageBundle\UrlGenerator\ResponsiveImageUrlGeneratorInterface;
34

35
final class ProgressiveImageExtension extends Extension implements PrependExtensionInterface
36
{
37
    public function getAlias(): string
38
    {
39
        return 'progressive_image';
490✔
40
    }
41

42
    public function prepend(ContainerBuilder $builder): void
43
    {
44
        $builder->prependExtensionConfig('framework', [
490✔
45
            'asset_mapper' => [
490✔
46
                'paths' => [
490✔
47
                    __DIR__.'/../../assets' => 'tito10047/progressive-image-bundle',
490✔
48
                ],
490✔
49
            ],
490✔
50
        ]);
490✔
51
        $builder->prependExtensionConfig('twig_component', [
490✔
52
            'defaults' => [
490✔
53
                'Tito10047\ProgressiveImageBundle\Twig\Components\\' => [
490✔
54
                    'template_directory' => '@ProgressiveImage/components/',
490✔
55
                    'name_prefix' => 'pgi',
490✔
56
                ],
490✔
57
            ],
490✔
58
        ]);
490✔
59

60
        $configs = $builder->getExtensionConfig($this->getAlias());
490✔
61
        $configs = $this->processConfiguration(new Configuration(), $configs);
490✔
62

63
        if (isset($configs['responsive_strategy']['breakpoints'])) {
490✔
64
            $breakpoints = $configs['responsive_strategy']['breakpoints'];
×
65
            $liipConfigs = $builder->getExtensionConfig('liip_imagine');
×
66

67
            $newFilterSets = [];
×
68
            foreach ($liipConfigs as $liipConfig) {
×
69
                if (isset($liipConfig['filter_sets'])) {
×
70
                    foreach ($liipConfig['filter_sets'] as $setName => $setConfig) {
×
71
                        foreach ($breakpoints as $breakpointName => $width) {
×
72
                            $newSetName = $setName.'_'.$breakpointName;
×
73
                            if (isset($newFilterSets[$newSetName])) {
×
74
                                continue;
×
75
                            }
76
                            $newSetConfig = $setConfig;
×
77

78
                            if (isset($newSetConfig['filters']['thumbnail']['size'])) {
×
79
                                [$origWidth, $origHeight] = $newSetConfig['filters']['thumbnail']['size'];
×
80
                                if ($origWidth > 0 && $origHeight > 0) {
×
81
                                    $ratio = $origHeight / $origWidth;
×
82
                                    $newHeight = (int) round($width * $ratio);
×
83
                                    $newSetConfig['filters']['thumbnail']['size'] = [$width, $newHeight];
×
84
                                } else {
85
                                    $newSetConfig['filters']['thumbnail']['size'] = [$width, $width];
×
86
                                }
87
                            }
88

89
                            $newFilterSets[$newSetName] = $newSetConfig;
×
90
                        }
91
                    }
92
                }
93
            }
94

95
            if (!empty($newFilterSets)) {
×
96
                $builder->prependExtensionConfig('liip_imagine', [
×
97
                    'filter_sets' => $newFilterSets,
×
98
                ]);
×
99
            }
100
        }
101
    }
102

103
    public function load(array $configs, ContainerBuilder $container): void
104
    {
105
        $configs = $this->processConfiguration(new Configuration(), $configs);
490✔
106

107
        if (!isset($container->getParameter('kernel.bundles')['TwigBundle'])) {
490✔
108
            throw new \LogicException('The TwigBundle is not registered in your application. Try running "composer require symfony/twig-bundle".');
×
109
        }
110

111
        $loader = new PhpFileLoader($container, new FileLocator(__DIR__.'/../../config'));
490✔
112
        $loader->load('services.php');
490✔
113

114
        $this->configureResolvers($configs, $container);
490✔
115

116
        $driver = $configs['driver'] ?? 'gd';
490✔
117
        $analyzerId = match ($driver) {
490✔
118
            'imagick' => 'progressive_image.analyzer.imagick',
×
119
            'gd' => 'progressive_image.analyzer.gd',
490✔
120
            default => $driver,
×
121
        };
490✔
122

123
        $loaderId = $configs['loader'] ?? 'progressive_image.filesystem.loader';
490✔
124
        $cacheId = $configs['cache'] ?? 'cache.app';
490✔
125
        $imageCacheServiceId = $configs['image_cache_service'] ?? 'cache.app';
490✔
126
        $imageCacheEnabled = $configs['image_cache_enabled'] ?? false;
490✔
127
        $ttl = $configs['ttl'] ?? null;
490✔
128

129
        if (!$imageCacheEnabled) {
490✔
130
            $imageCacheServiceReference = null;
15✔
131
        } else {
132
            $imageCacheServiceReference = new Reference('progressive_image.image_cache_service');
475✔
133
        }
134

135
        $definition = $container->getDefinition(MetadataReader::class);
490✔
136
        $definition->setArgument('$analyzer', new Reference($analyzerId))
490✔
137
            ->setArgument('$loader', new Reference($loaderId))
490✔
138
                        ->setArgument('$pathResolver', new Reference('progressive_image.resolver.default'))
490✔
139
            ->setArgument('$cache', new Reference($cacheId))
490✔
140
            ->setArgument('$ttl', $configs['ttl'] ?? null)
490✔
141
            ->setArgument('$fallbackPath', $configs['fallback_image'] ?? null)
490✔
142
        ;
490✔
143
        $container->setParameter('progressive_image.image_cache_enabled', $imageCacheEnabled);
490✔
144
        $container->setParameter('progressive_image.ttl', $ttl);
490✔
145
        $container->setAlias('progressive_image.image_cache_service', $imageCacheServiceId);
490✔
146

147
        $container->register(TransparentCacheExtension::class)
490✔
148
            ->setArgument('$ttl', new Parameter('progressive_image.ttl'))
490✔
149
            ->setArgument('$cache', $imageCacheServiceReference)
490✔
150
            ->addTag('twig.extension')
490✔
151
        ;
490✔
152

153
        $container->register(TransparentImageCacheSubscriber::class)
490✔
154
            ->setArgument('$enabled', new Parameter('progressive_image.image_cache_enabled'))
490✔
155
            ->setArgument('$cache', $imageCacheServiceReference)
490✔
156
            ->setArgument('$ttl', new Parameter('progressive_image.ttl'))
490✔
157
            ->addTag('kernel.event_subscriber')
490✔
158
        ;
490✔
159

160
        if (class_exists(LiipImagineBundle::class)) {
490✔
UNCOV
161
            $container->register(LiipImagineResponsiveImageUrlGenerator::class)
476✔
UNCOV
162
                ->setArgument('$cacheManager', new Reference('liip_imagine.cache.manager'))
476✔
UNCOV
163
                ->setArgument('$router', new Reference('router'))
476✔
UNCOV
164
                ->setArgument('$uriSigner', new Reference('uri_signer'))
476✔
UNCOV
165
                ->setArgument('$runtimeConfigGenerator', new Reference(LiipImagineRuntimeConfigGenerator::class))
476✔
UNCOV
166
                ->setArgument('$filterConfiguration', new Reference('liip_imagine.filter.configuration'))
476✔
UNCOV
167
                ->setArgument('$cache', $imageCacheServiceReference)
476✔
UNCOV
168
                ->setPublic(true);
476✔
169

UNCOV
170
            $container->setAlias(ResponsiveImageUrlGeneratorInterface::class, LiipImagineResponsiveImageUrlGenerator::class);
476✔
171
        }
172
        $responsiveConfig = $configs['responsive_strategy'] ?? [];
490✔
173
        $generatorId = $responsiveConfig['generator'] ?? null;
490✔
174

175
        if ($generatorId || class_exists(LiipImagineBundle::class)) {
490✔
UNCOV
176
            $container->register(ResponsiveAttributeGenerator::class, ResponsiveAttributeGenerator::class)
476✔
UNCOV
177
                ->setArgument('$gridConfig', $responsiveConfig['grid'] ?? [])
476✔
UNCOV
178
                ->setArgument('$ratioConfig', $responsiveConfig['ratios'] ?? [])
476✔
UNCOV
179
                ->setArgument('$preloadCollector', new Reference(PreloadCollector::class))
476✔
UNCOV
180
                ->setArgument('$urlGenerator', $generatorId ? new Reference($generatorId) : new Reference(ResponsiveImageUrlGeneratorInterface::class))
476✔
UNCOV
181
            ;
476✔
182
        }
183

184
        $container->register(Image::class, Image::class)
490✔
185
            ->setArgument('$analyzer', new Reference(MetadataReader::class))
490✔
186
            ->setArgument('$pathDecorator', array_map(fn ($id) => new Reference($id), $configs['path_decorators'] ?? []))
490✔
187
            ->setArgument('$responsiveAttributeGenerator', $generatorId || class_exists(LiipImagineBundle::class) ? new Reference(ResponsiveAttributeGenerator::class) : null)
490✔
188
            ->setArgument('$preloadCollector', new Reference(PreloadCollector::class))
490✔
189
                        ->setArgument('$framework', $configs['responsive_strategy']['grid']['framework'] ?? 'custom')
490✔
190
            ->setShared(false)
490✔
191
            ->addTag('twig.component')
490✔
192
            ->setPublic(true);
490✔
193
    }
194

195
    /**
196
     * @param array<string, mixed> $config
197
     */
198
    private function configureResolvers(array $config, ContainerBuilder $container): void
199
    {
200
        $resolvers = $config['resolvers'] ?? [];
490✔
201
        foreach ($resolvers as $name => $resolverConfig) {
490✔
202
            $id = 'progressive_image.resolver.'.$name;
300✔
203

204
            if ('filesystem' === $resolverConfig['type']) {
300✔
205
                $container->register($id, FileSystemResolver::class)
300✔
206
                    ->setArgument('$roots', $resolverConfig['roots'] ?? ['%kernel.project_dir%/public'])
300✔
207
                                        ->setArgument('$allowUnresolvable', $resolverConfig['allowUnresolvable'] ?? true);
300✔
208
            } elseif ('asset_mapper' === $resolverConfig['type']) {
15✔
209
                                $container->register($id, AssetMapperResolver::class)
15✔
210
                                        ->setArgument('$assetMapper', new Reference('asset_mapper'));
15✔
211
                        } elseif ('chain' === $resolverConfig['type']) {
15✔
212
                                $childResolvers = array_map(fn($name) => new Reference('progressive_image.resolver.' . $name), $resolverConfig['resolvers'] ?? []);
15✔
213
                                $container->register($id, ChainResolver::class)
15✔
214
                                        ->setArgument('$resolvers', $childResolvers);
15✔
215
            }
216
        }
217

218
                $resolver = $config['resolver'] ?? 'default';
490✔
219

220
                if (isset($resolvers[$resolver])) {
490✔
221
                        $container->setAlias('progressive_image.resolver.default', 'progressive_image.resolver.' . $resolver);
285✔
222
                } elseif (in_array($resolver, ['filesystem', 'asset_mapper'])) {
205✔
223
                        $container->setAlias('progressive_image.resolver.default', 'progressive_image.resolver.' . $resolver);
×
224
                } elseif (!empty($resolvers) && 'default' === $resolver) {
205✔
225
            $firstResolver = array_key_first($resolvers);
15✔
226
            $container->setAlias('progressive_image.resolver.default', 'progressive_image.resolver.'.$firstResolver);
15✔
227
        } else {
228
            $container->register('progressive_image.resolver.default', FileSystemResolver::class)
190✔
229
                ->setArgument('$roots', ['%kernel.project_dir%/public'])
190✔
230
                ->setArgument('$allowUnresolvable', true);
190✔
231
        }
232
    }
233
}
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