Completed
Pull Request — master (#1221)
by
unknown
01:34
created

LiipImagineExtension::getConfiguration()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 4
rs 10
cc 1
nc 1
nop 2
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\DependencyInjection\Factory\Loader\LoaderFactoryInterface;
15
use Liip\ImagineBundle\DependencyInjection\Factory\Resolver\ResolverFactoryInterface;
16
use Liip\ImagineBundle\Imagine\Cache\CacheManager;
17
use Liip\ImagineBundle\Imagine\Data\DataManager;
18
use Liip\ImagineBundle\Imagine\Filter\FilterManager;
19
use Symfony\Component\Config\FileLocator;
20
use Symfony\Component\DependencyInjection\Alias;
21
use Symfony\Component\DependencyInjection\ContainerBuilder;
22
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
23
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
24
25
class LiipImagineExtension extends Extension
26
{
27
    /**
28
     * @var ResolverFactoryInterface[]
29
     */
30
    private $resolversFactories = [];
31
32
    /**
33
     * @var LoaderFactoryInterface[]
34
     */
35
    private $loadersFactories = [];
36
37
    /**
38
     * @param ResolverFactoryInterface $resolverFactory
39
     */
40
    public function addResolverFactory(ResolverFactoryInterface $resolverFactory)
41
    {
42
        $this->resolversFactories[$resolverFactory->getName()] = $resolverFactory;
43
    }
44
45
    /**
46
     * @param LoaderFactoryInterface $loaderFactory
47
     */
48
    public function addLoaderFactory(LoaderFactoryInterface $loaderFactory)
49
    {
50
        $this->loadersFactories[$loaderFactory->getName()] = $loaderFactory;
51
    }
52
53
    /**
54
     * {@inheritdoc}
55
     */
56
    public function getConfiguration(array $config, ContainerBuilder $container)
57
    {
58
        return new Configuration($this->resolversFactories, $this->loadersFactories);
59
    }
60
61
    /**
62
     * @see \Symfony\Component\DependencyInjection\Extension.ExtensionInterface::load()
63
     *
64
     * @param array            $configs
65
     * @param ContainerBuilder $container
66
     */
67
    public function load(array $configs, ContainerBuilder $container)
68
    {
69
        $config = $this->processConfiguration(
70
            $this->getConfiguration($configs, $container),
0 ignored issues
show
Bug introduced by
It seems like $this->getConfiguration($configs, $container) can be null; however, processConfiguration() does not accept null, maybe add an additional type check?

Unless you are absolutely sure that the expression can never be null because of other conditions, we strongly recommend to add an additional type check to your code:

/** @return stdClass|null */
function mayReturnNull() { }

function doesNotAcceptNull(stdClass $x) { }

// With potential error.
function withoutCheck() {
    $x = mayReturnNull();
    doesNotAcceptNull($x); // Potential error here.
}

// Safe - Alternative 1
function withCheck1() {
    $x = mayReturnNull();
    if ( ! $x instanceof stdClass) {
        throw new \LogicException('$x must be defined.');
    }
    doesNotAcceptNull($x);
}

// Safe - Alternative 2
function withCheck2() {
    $x = mayReturnNull();
    if ($x instanceof stdClass) {
        doesNotAcceptNull($x);
    }
}
Loading history...
71
            $configs
72
        );
73
74
        $container->setParameter('liip_imagine.resolvers', $config['resolvers']);
75
        $container->setParameter('liip_imagine.loaders', $config['loaders']);
76
77
        $this->loadResolvers($config['resolvers'], $container);
78
        $this->loadLoaders($config['loaders'], $container);
79
80
        $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
81
        $loader->load('imagine.xml');
82
        $loader->load('commands.xml');
83
84
        if ($config['enqueue']) {
85
            $loader->load('enqueue.xml');
86
        }
87
88
        $container->setParameter('liip_imagine.driver_service', 'liip_imagine.'.$config['driver']);
89
90
        $container->setAlias('liip_imagine', new Alias('liip_imagine.'.$config['driver']));
91
        $container->setAlias(CacheManager::class, new Alias('liip_imagine.cache.manager', false));
92
        $container->setAlias(DataManager::class, new Alias('liip_imagine.data.manager', false));
93
        $container->setAlias(FilterManager::class, new Alias('liip_imagine.filter.manager', false));
94
95
        $container->setParameter('liip_imagine.cache.resolver.default', $config['cache']);
96
97
        $container->setParameter('liip_imagine.default_image', $config['default_image']);
98
99
        $filterSets = $this->createFilterSets($config['filter_sets']);
100
101
        $container->setParameter('liip_imagine.filter_sets', $filterSets);
102
        $container->setParameter('liip_imagine.binary.loader.default', $config['data_loader']);
103
104
        $container->setParameter('liip_imagine.controller.filter_action', $config['controller']['filter_action']);
105
        $container->setParameter('liip_imagine.controller.filter_runtime_action', $config['controller']['filter_runtime_action']);
106
107
        $container->setParameter('twig.form.resources', array_merge(
108
            $container->hasParameter('twig.form.resources') ? $container->getParameter('twig.form.resources') : [],
109
            ['@LiipImagine/Form/form_div_layout.html.twig']
110
        ));
111
    }
112
113
    private function createFilterSets(array $filterSets): array
114
    {
115
        $defaultFilterSetData = [
116
            'quality' => 100,
117
            'jpeg_quality' => null,
118
            'png_compression_level' => null,
119
            'png_compression_filter' => null,
120
            'format' => null,
121
            'animated' => false,
122
            'cache' => null,
123
            'data_loader' => null,
124
            'default_image' => null,
125
        ];
126
127
        if (isset($filterSets['_defaults'])) {
128
            $defaultFilterSetData = array_replace_recursive($defaultFilterSetData, $filterSets['_defaults']);
129
            unset($filterSets['_defaults']);
130
        }
131
132
        return array_map(function (array $filterSet) use ($defaultFilterSetData) {
133
            return array_replace_recursive($defaultFilterSetData, $filterSet);
134
        }, $filterSets);
135
    }
136
137
    /**
138
     * @param array            $config
139
     * @param ContainerBuilder $container
140
     */
141
    private function loadResolvers(array $config, ContainerBuilder $container)
142
    {
143
        $this->createFactories($this->resolversFactories, $config, $container);
144
    }
145
146
    /**
147
     * @param array            $config
148
     * @param ContainerBuilder $container
149
     */
150
    private function loadLoaders(array $config, ContainerBuilder $container)
151
    {
152
        $this->createFactories($this->loadersFactories, $config, $container);
153
    }
154
155
    /**
156
     * @param array            $factories
157
     * @param array            $configurations
158
     * @param ContainerBuilder $container
159
     */
160
    private function createFactories(array $factories, array $configurations, ContainerBuilder $container)
161
    {
162
        foreach ($configurations as $name => $conf) {
163
            $factories[key($conf)]->create($container, $name, $conf[key($conf)]);
164
        }
165
    }
166
}
167