SymfonySerializerCompilerPass::process()   C
last analyzed

Complexity

Conditions 7
Paths 9

Size

Total Lines 46
Code Lines 25

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 13
CRAP Score 12.419

Importance

Changes 3
Bugs 0 Features 0
Metric Value
dl 0
loc 46
ccs 13
cts 25
cp 0.52
rs 6.7272
c 3
b 0
f 0
cc 7
eloc 25
nc 9
nop 1
crap 12.419
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