Failed Conditions
Push — master ( 5537f8...d96005 )
by Florent
02:00
created

JoseFrameworkExtension::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 5
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 3
nc 1
nop 1
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * The MIT License (MIT)
7
 *
8
 * Copyright (c) 2014-2017 Spomky-Labs
9
 *
10
 * This software may be modified and distributed under the terms
11
 * of the MIT license.  See the LICENSE file for details.
12
 */
13
14
namespace Jose\Bundle\JoseFramework\DependencyInjection;
15
16
use Http\HttplugBundle\HttplugBundle;
17
use Jose\Bundle\Checker\DependencyInjection\Source\ClaimChecker;
18
use Jose\Bundle\Checker\DependencyInjection\Source\HeaderChecker;
19
use Jose\Bundle\Encryption\DependencyInjection\Source\JWEBuilder;
20
use Jose\Bundle\Encryption\DependencyInjection\Source\JWEDecrypter;
21
use Jose\Bundle\JoseFramework\DependencyInjection\Source\SourceInterface;
22
use Jose\Bundle\KeyManagement\DependencyInjection\Source\JKUSource;
23
use Jose\Bundle\KeyManagement\DependencyInjection\Source\JWKSetSource;
24
use Jose\Bundle\KeyManagement\DependencyInjection\Source\JWKSource;
25
use Jose\Bundle\Signature\DependencyInjection\Source\JWSBuilder;
26
use Jose\Bundle\Signature\DependencyInjection\Source\JWSVerifier;
27
use Jose\Component\Core\Converter\JsonConverterInterface;
28
use Jose\Component\Core\Converter\JsonConverter;
29
use Symfony\Component\Config\Definition\Processor;
30
use Symfony\Component\Config\FileLocator;
31
use Symfony\Component\DependencyInjection\ContainerBuilder;
32
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
33
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
34
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
35
36
/**
37
 * Class JoseFrameworkExtension.
38
 */
39
final class JoseFrameworkExtension extends Extension implements PrependExtensionInterface
40
{
41
    /**
42
     * @var string
43
     */
44
    private $alias;
45
46
    /**
47
     * @var SourceInterface[]
48
     */
49
    private $serviceSources = [];
50
51
    /**
52
     * JoseFrameworkExtension constructor.
53
     *
54
     * @param string $alias
55
     */
56
    public function __construct(string $alias)
57
    {
58
        $this->alias = $alias;
59
        $this->addDefaultSources();
60
    }
61
62
    /**
63
     * {@inheritdoc}
64
     */
65
    public function getAlias(): string
66
    {
67
        return $this->alias;
68
    }
69
70
    /**
71
     * {@inheritdoc}
72
     */
73
    public function load(array $configs, ContainerBuilder $container)
74
    {
75
        $processor = new Processor();
76
        $config = $processor->processConfiguration($this->getConfiguration($configs, $container), $configs);
77
78
        $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
79
        $loader->load('services.yml');
80
81
        $container->setAlias(JsonConverterInterface::class, $config['json_converter']);
82
        if (JsonConverter::class === $config['json_converter']) {
83
            $loader->load('json_converter.yml');
84
        }
85
86
        foreach ($this->serviceSources as $serviceSource) {
87
            $serviceSource->load($config, $container);
88
        }
89
    }
90
91
    /**
92
     * @param SourceInterface $source
93
     */
94
    public function addSource(SourceInterface $source)
95
    {
96
        $name = $source->name();
97
        if (in_array($name, $this->serviceSources)) {
98
            throw new \InvalidArgumentException(sprintf('The source "%s" is already set.', $name));
99
        }
100
        $this->serviceSources[$name] = $source;
101
    }
102
103
    /**
104
     * @param array            $configs
105
     * @param ContainerBuilder $container
106
     *
107
     * @return Configuration
108
     */
109
    public function getConfiguration(array $configs, ContainerBuilder $container): Configuration
110
    {
111
        return new Configuration($this->getAlias(), $this->serviceSources);
112
    }
113
114
    private function addDefaultSources()
115
    {
116
        if (class_exists(JKUSource::class) && class_exists(HttplugBundle::class)) {
117
            $this->addSource(new JKUSource());
118
        }
119
        if (class_exists(JWKSource::class)) {
120
            $this->addSource(new JWKSource());
121
        }
122
        if (class_exists(JWKSetSource::class)) {
123
            $this->addSource(new JWKSetSource());
124
        }
125
        if (class_exists(ClaimChecker::class)) {
126
            $this->addSource(new ClaimChecker());
127
        }
128
        if (class_exists(HeaderChecker::class)) {
129
            $this->addSource(new HeaderChecker());
130
        }
131
        if (class_exists(JWSBuilder::class)) {
132
            $this->addSource(new JWSBuilder());
133
        }
134
        if (class_exists(JWSVerifier::class)) {
135
            $this->addSource(new JWSVerifier());
136
        }
137
        if (class_exists(JWEBuilder::class)) {
138
            $this->addSource(new JWEBuilder());
139
        }
140
        if (class_exists(JWEDecrypter::class)) {
141
            $this->addSource(new JWEDecrypter());
142
        }
143
    }
144
145
    /**
146
     * {@inheritdoc}
147
     */
148
    public function prepend(ContainerBuilder $container)
149
    {
150
        $configs = $container->getExtensionConfig($this->getAlias());
151
        $config = $this->processConfiguration($this->getConfiguration($configs, $container), $configs);
152
153
        foreach ($this->serviceSources as $serviceSource) {
154
            $result = $serviceSource->prepend($container, $config);
155
            if (null !== $result) {
156
                $container->prependExtensionConfig($this->getAlias(), $result);
157
            }
158
        }
159
    }
160
}
161