Completed
Push — master ( 9dfe4a...9f73a9 )
by Alexey
03:27
created

RequestDtoExtension::load()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 1
eloc 3
c 1
b 0
f 1
nc 1
nop 2
dl 0
loc 5
ccs 4
cts 4
cp 1
crap 1
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Nelexa\RequestDtoBundle\DependencyInjection;
6
7
use Nelexa\RequestDtoBundle\ArgumentResolver\ConstraintViolationListValueResolver;
8
use Nelexa\RequestDtoBundle\ArgumentResolver\QueryObjectValueResolver;
9
use Nelexa\RequestDtoBundle\ArgumentResolver\RequestBodyObjectValueResolver;
10
use Nelexa\RequestDtoBundle\ArgumentResolver\RequestObjectValueResolver;
11
use Nelexa\RequestDtoBundle\EventListener\RequestDtoControllerArgumentListener;
12
use Nelexa\RequestDtoBundle\EventListener\RequestDtoExceptionListener;
13
use Nelexa\RequestDtoBundle\Normalizer\RequestDtoExceptionNormalizer;
14
use Symfony\Component\DependencyInjection\ContainerBuilder;
15
use Symfony\Component\DependencyInjection\Definition;
16
use Symfony\Component\DependencyInjection\Extension\Extension;
17
use Symfony\Component\DependencyInjection\Reference;
18
use Symfony\Component\HttpKernel\KernelEvents;
19
20
class RequestDtoExtension extends Extension
21
{
22
    /**
23
     * Loads a specific configuration.
24
     *
25
     * @throws \InvalidArgumentException|\Exception When provided tag is not defined in this extension
26
     */
27 1
    public function load(array $configs, ContainerBuilder $container): void
28
    {
29 1
        $this->registerArgumentResolvers($container);
30 1
        $this->registerEventListeners($container);
31 1
        $this->registerNormalizers($container);
32 1
    }
33
34 1
    private function registerArgumentResolvers(ContainerBuilder $container): void
35
    {
36 1
        $this->registerArgumentResolver($container, RequestBodyObjectValueResolver::class, 40);
37 1
        $this->registerArgumentResolver($container, RequestObjectValueResolver::class, 40);
38 1
        $this->registerArgumentResolver($container, QueryObjectValueResolver::class, 40);
39 1
        $this->registerArgumentResolver($container, ConstraintViolationListValueResolver::class, -40);
40 1
    }
41
42 1
    private function registerArgumentResolver(ContainerBuilder $container, string $className, int $priority = 0): void
43
    {
44 1
        $definition = new Definition($className);
45 1
        $definition->setAutowired(true);
46 1
        $definition->setPublic(false);
47 1
        $definition->addTag(
48 1
            'controller.argument_value_resolver',
49
            [
50 1
                'priority' => $priority,
51
            ]
52
        );
53
54 1
        $container->setDefinition($className, $definition);
55 1
    }
56
57 1
    private function registerEventListeners(ContainerBuilder $container): void
58
    {
59 1
        $this->registerEventListenerControllerArguments($container);
60 1
        $this->registerExceptionEventListener($container);
61 1
    }
62
63 1
    private function registerEventListenerControllerArguments(ContainerBuilder $container): void
64
    {
65 1
        $definition = new Definition(RequestDtoControllerArgumentListener::class);
66 1
        $definition->setPublic(false);
67 1
        $definition->addTag(
68 1
            'kernel.event_listener',
69
            [
70 1
                'event' => KernelEvents::CONTROLLER_ARGUMENTS,
71 1
                'method' => 'onControllerArguments',
72
            ]
73
        );
74
75 1
        $container->setDefinition(RequestDtoControllerArgumentListener::class, $definition);
76 1
    }
77
78 1
    private function registerExceptionEventListener(ContainerBuilder $container): void
79
    {
80 1
        $definition = new Definition(RequestDtoExceptionListener::class);
81 1
        $definition->setAutowired(true);
82 1
        $definition->setPublic(false);
83 1
        $definition->addTag(
84 1
            'kernel.event_listener',
85
            [
86 1
                'event' => KernelEvents::EXCEPTION,
87 1
                'method' => 'onKernelException',
88 1
                'priority' => 30,
89
            ]
90
        );
91
92 1
        $container->setDefinition(RequestDtoExceptionListener::class, $definition);
93 1
    }
94
95 1
    private function registerNormalizers(ContainerBuilder $container): void
96
    {
97 1
        $definition = new Definition(RequestDtoExceptionNormalizer::class);
98 1
        $definition->setAutowired(true);
99 1
        $definition->setPublic(false);
100 1
        $definition->setArgument(
101 1
            '$normalizer',
102 1
            new Reference('serializer.normalizer.constraint_violation_list')
103
        );
104 1
        $definition->setArgument('$debug', '%kernel.debug%');
105 1
        $definition->addTag(
106 1
            'serializer.normalizer',
107
            [
108 1
                'priority' => -885,
109
            ]
110
        );
111
112 1
        $container->setDefinition(RequestDtoExceptionNormalizer::class, $definition);
113 1
    }
114
}
115