Completed
Push — master ( 993520...f97157 )
by Dawid
06:13
created

addOrReplaceDefinitionArgument()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 8
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 8
ccs 5
cts 5
cp 1
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 5
nc 2
nop 3
crap 2
1
<?php
2
3
namespace Spiechu\SymfonyCommonsBundle\DependencyInjection;
4
5
use Symfony\Component\Config\FileLocator;
6
use Symfony\Component\DependencyInjection\ContainerBuilder;
7
use Symfony\Component\DependencyInjection\Definition;
8
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
9
use Symfony\Component\DependencyInjection\Exception\OutOfBoundsException;
10
use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
11
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
12
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
13
14
class SpiechuSymfonyCommonsExtension extends Extension
15
{
16
    /**
17
     * {@inheritdoc}
18
     *
19
     * @throws OutOfBoundsException
20
     * @throws ServiceNotFoundException
21
     * @throws \Exception
22
     * @throws InvalidArgumentException
23
     */
24 17
    public function load(array $configs, ContainerBuilder $container): void
25
    {
26 17
        $processedConfig = $this->processConfiguration(new Configuration(), $configs);
27
28 17
        $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
29
30 17
        $loader->load('services.xml');
31
32 17
        $this->processGetMethodOverride($loader, $container, $processedConfig['get_method_override']);
33 17
        $this->processResponseSchemaValidation($loader, $container, $processedConfig['response_schema_validation']);
34 17
        $this->processApiVersioning($loader, $container, $processedConfig['api_versioning']);
35
36 17
        if ($container->getParameter('kernel.debug')) {
37 7
            $loader->load('debug_services.xml');
38
        }
39 17
    }
40
41
    /**
42
     * @param XmlFileLoader    $loader
43
     * @param ContainerBuilder $container
44
     * @param array            $options
45
     *
46
     * @throws \Exception
47
     */
48 17
    protected function processGetMethodOverride(XmlFileLoader $loader, ContainerBuilder $container, array $options): void
49
    {
50 17
        if (!$options['enabled']) {
51 10
            return;
52
        }
53
54 7
        if ('spiechu_symfony_commons.event_listener.get_method_override_listener' === $options['listener_service_id']) {
55 6
            $loader->load('get_method_override_listener.xml');
56
        }
57
58 7
        $getMethodOverrideListenerDefinition = $container->getDefinition($options['listener_service_id']);
59
60 7
        $this->addOrReplaceDefinitionArgument($getMethodOverrideListenerDefinition, 0, $options['query_param_name']);
61 7
        $this->addOrReplaceDefinitionArgument($getMethodOverrideListenerDefinition, 1, $options['allow_methods_override']);
62 7
    }
63
64
    /**
65
     * @param XmlFileLoader    $loader
66
     * @param ContainerBuilder $container
67
     * @param array            $options
68
     *
69
     * @throws \Exception
70
     */
71 17
    protected function processResponseSchemaValidation(XmlFileLoader $loader, ContainerBuilder $container, array $options): void
72
    {
73 17
        if (!$options['enabled']) {
74 7
            return;
75
        }
76
77 10
        $loader->load('response_schema_validation_listeners.xml');
78
79 10
        $this->addOrReplaceDefinitionArgument(
80 10
            $container->getDefinition('spiechu_symfony_commons.event_listener.response_schema_validator_listener'),
81 10
            1,
82 10
            $options['throw_exception_when_format_not_found']
83
        );
84
85 10
        if ('spiechu_symfony_commons.event_listener.failed_schema_check_listener' !== $options['failed_schema_check_listener_service_id']) {
86 1
            $this->clearListenerTags($container->getDefinition('spiechu_symfony_commons.event_listener.failed_schema_check_listener'));
87
        }
88
89 10
        if ($options['disable_json_check_schema_subscriber']) {
90 1
            $this->clearListenerTags($container->getDefinition('spiechu_symfony_commons.event_listener.json_check_schema_subscriber'));
91
        }
92 10
        if ($options['disable_xml_check_schema_subscriber']) {
93
            $this->clearListenerTags($container->getDefinition('spiechu_symfony_commons.event_listener.xml_check_schema_subscriber'));
94
        }
95 10
    }
96
97
    /**
98
     * @param XmlFileLoader    $loader
99
     * @param ContainerBuilder $container
100
     * @param array            $options
101
     *
102
     * @throws \Exception
103
     */
104 17
    protected function processApiVersioning(XmlFileLoader $loader, ContainerBuilder $container, array $options): void
105
    {
106 17
        if (!$options['enabled']) {
107 9
            return;
108
        }
109
110 8
        $loader->load('api_versioning_listeners.xml');
111
112 8
        if (!empty($options['features'])) {
113 4
            $featuresProviderDefinition = $container->getDefinition('spiechu_symfony_commons.service.api_version_features_provider');
114 4
            $featuresProviderDefinition->addMethodCall('addFeatures', [$options['features']]);
115
        }
116
117 8
        if (!$options['versioned_view_listener']) {
118 6
            $this->clearListenerTags($container->getDefinition('spiechu_symfony_commons.event_listener.versioned_view_listener'));
119
        }
120 8
    }
121
122
    /**
123
     * @param Definition $definition
124
     * @param int        $index
125
     * @param mixed      $value
126
     *
127
     * @throws OutOfBoundsException
128
     */
129 12
    protected function addOrReplaceDefinitionArgument(Definition $definition, int $index, $value): void
130
    {
131 12
        if (array_key_exists($index, $definition->getArguments())) {
132 1
            $definition->replaceArgument($index, $value);
133
        } else {
134 12
            $definition->setArgument($index, $value);
135
        }
136 12
    }
137
138
    /**
139
     * @param Definition $definition
140
     */
141 8
    protected function clearListenerTags(Definition $definition): void
142
    {
143 8
        $definition->clearTag('kernel.event_subscriber');
144 8
        $definition->clearTag('kernel.event_listener');
145
146 8
        $definition->setPublic(false);
147 8
    }
148
}
149