SymfonySerializerCompilerPass   A
last analyzed

Complexity

Total Complexity 11

Size/Duplication

Total Lines 69
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 5

Test Coverage

Coverage 54.84%

Importance

Changes 3
Bugs 0 Features 0
Metric Value
wmc 11
lcom 0
cbo 5
dl 0
loc 69
ccs 17
cts 31
cp 0.5484
rs 10
c 3
b 0
f 0

2 Methods

Rating   Name   Duplication   Size   Complexity  
C process() 0 46 7
A shouldHaveNormalizerConfigured() 0 13 4
1
<?php
2
3
namespace ScayTrase\Api\Cruds\DependencyInjection\Compiler;
4
5
use Symfony\Component\Config\FileLocator;
6
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
7
use Symfony\Component\DependencyInjection\ContainerBuilder;
8
use Symfony\Component\DependencyInjection\Loader;
9
use Symfony\Component\DependencyInjection\Reference;
10
use Symfony\Component\HttpKernel\Kernel;
11
use Symfony\Component\Serializer\NameConverter\CamelCaseToSnakeCaseNameConverter;
12
use Symfony\Component\Serializer\SerializerInterface;
13
14
final class SymfonySerializerCompilerPass implements CompilerPassInterface
15
{
16
    /** {@inheritdoc} */
17 30
    public function process(ContainerBuilder $container)
18
    {
19 30
        if (!$container->has('serializer') || $container->hasAlias('serializer')) {
20
21
            return;
22
        }
23
24 30
        $class = $container->getDefinition('serializer')->getClass();
25
26 30
        if ('%serializer.class%' === $class) {
27
            // 2.x Definition
28
            $class = $container->getParameter('serializer.class');
29
        }
30
31 30
        if (!in_array(SerializerInterface::class, class_implements($class), true)) {
32
            return;
33
        }
34
35 30
        $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__ . '/../../Resources/config'));
36 30
        $loader->load('symfony_serializer.yml');
37
38
        /** @var Reference $converter */
39 30
        $objectNormalizer = $container->getDefinition('serializer.normalizer.object');
40
41 30
        if ($this->shouldHaveNormalizerConfigured($container)) {
42
            $converter = $objectNormalizer->getArgument(1);
43 30
        } elseif ($container->has('serializer.name_converter.camel_case_to_snake_case')) {
44 30
            $converter = new Reference('serializer.name_converter.camel_case_to_snake_case');
45
        } else {
46
            $container->register(
47
                'serializer.name_converter.camel_case_to_snake_case',
48
                CamelCaseToSnakeCaseNameConverter::class
49
            );
50
            $converter = new Reference('serializer.name_converter.camel_case_to_snake_case');
51
            $objectNormalizer->setArguments(
52
                array_replace(
53
                    $objectNormalizer->getArguments(),
54
                    [
55
                        1 => $converter,
56
                    ]
57
                )
58
            );
59
        }
60
61 30
        $container->setAlias('serializer.normalizer.object.name_converter', (string)$converter);
62 30
    }
63
64
    /**
65
     * @param ContainerBuilder $container
66
     *
67
     * @return bool
68
     */
69 30
    private function shouldHaveNormalizerConfigured(ContainerBuilder $container)
70
    {
71 30
        $kernel = $container->getDefinition('kernel')->getClass();
72
73 30
        return $kernel instanceof Kernel &&
74
               (
75
                   $kernel::MAJOR_VERSION === '3' ||
76
                   (
77
                       $kernel::MAJOR_VERSION === '2'
78 30
                       && $kernel::MINOR_VERSION === '8'
79
                   )
80
               );
81
    }
82
}
83