DamaxMediaExtension   A
last analyzed

Complexity

Total Complexity 7

Size/Duplication

Total Lines 80
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 42
dl 0
loc 80
rs 10
c 0
b 0
f 0
wmc 7

4 Methods

Rating   Name   Duplication   Size   Complexity  
A configureGlide() 0 17 1
A configureStorage() 0 19 2
A loadInternal() 0 17 2
A configureTypes() 0 18 2
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Damax\Media\Bridge\Symfony\Bundle\DependencyInjection;
6
7
use Damax\Media\Application\Query\GetImageHandler;
8
use Damax\Media\Domain\Image\Manipulator;
9
use Damax\Media\Domain\Image\UrlBuilder;
10
use Damax\Media\Domain\Model\Media;
11
use Damax\Media\Domain\Storage\Keys\Keys;
12
use Damax\Media\Domain\Storage\Keys\RandomKeys;
13
use Damax\Media\Domain\Storage\Storage;
14
use Damax\Media\Glide\GlideManipulator;
15
use Damax\Media\Glide\SignedUrlBuilder;
16
use Damax\Media\Type\Definition as TypeDefinition;
17
use Damax\Media\Type\Types;
18
use Gaufrette\FilesystemMap;
19
use Gaufrette\StreamWrapper;
20
use League\Glide\Signatures\Signature;
21
use League\Glide\Signatures\SignatureInterface;
22
use Symfony\Component\Config\FileLocator;
23
use Symfony\Component\DependencyInjection\ContainerBuilder;
24
use Symfony\Component\DependencyInjection\Definition;
25
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
26
use Symfony\Component\HttpKernel\DependencyInjection\ConfigurableExtension;
27
28
final class DamaxMediaExtension extends ConfigurableExtension
29
{
30
    protected function loadInternal(array $config, ContainerBuilder $container)
31
    {
32
        $loader = new XmlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
33
        $loader->load('services.xml');
34
        $loader->load('doctrine-orm.xml');
35
36
        $this
37
            ->configureStorage($config['storage'], $container)
38
            ->configureTypes($config['types'], $container)
39
        ;
40
41
        $container->setParameter('damax.media.media_class', Media::class);
42
43
        if (!empty($config['glide'])) {
44
            $this->configureGlide($config['glide'], $container);
45
        } else {
46
            $container->removeDefinition(GetImageHandler::class);
47
        }
48
    }
49
50
    private function configureStorage(array $config, ContainerBuilder $container): self
51
    {
52
        $storage = ucfirst($config['adapter']);
53
54
        $container->autowire(Storage::class, sprintf('Damax\\Media\\%s\\%sStorage', $storage, $storage));
55
56
        $container
57
            ->autowire(Keys::class, RandomKeys::class)
58
            ->setArgument(1, $config['key_length'])
59
        ;
60
61
        if (Configuration::ADAPTER_GAUFRETTE === $config['adapter']) {
62
            $container
63
                ->register(FilesystemMap::class)
64
                ->setFactory(StreamWrapper::class . '::getFilesystemMap')
65
            ;
66
        }
67
68
        return $this;
69
    }
70
71
    private function configureTypes(array $config, ContainerBuilder $container): self
72
    {
73
        $types = [];
74
75
        foreach ($config as $name => $item) {
76
            $types[$name] = new Definition(TypeDefinition::class, [
77
                $item['storage'],
78
                $item['max_file_size'],
79
                $item['mime_types'],
80
            ]);
81
        }
82
83
        $container
84
            ->register(Types::class)
85
            ->addArgument($types)
86
        ;
87
88
        return $this;
89
    }
90
91
    private function configureGlide(array $config, ContainerBuilder $container): self
92
    {
93
        $serverParams = $config;
94
        unset($serverParams['sign_key']);
95
96
        $container
97
            ->autowire(SignatureInterface::class, Signature::class)
98
            ->addArgument($config['sign_key'])
99
        ;
100
        $container
101
            ->autowire(Manipulator::class, GlideManipulator::class)
102
            ->setArgument(3, $serverParams)
103
        ;
104
105
        $container->autowire(UrlBuilder::class, SignedUrlBuilder::class);
106
107
        return $this;
108
    }
109
}
110