Completed
Pull Request — master (#39)
by Daniel
04:05
created

SerializerSymfonyFactory::getSerializer()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 3
c 1
b 0
f 0
dl 0
loc 7
rs 10
cc 2
nc 2
nop 0
1
<?php
2
3
namespace Jellyfish\SerializerSymfony;
4
5
use Jellyfish\SerializerSymfony\NameConverter\PropertyNameConverter;
6
use Jellyfish\SerializerSymfony\NameConverter\PropertyNameConverterInterface;
7
use Jellyfish\SerializerSymfony\NameConverter\PropertyNameConverterStrategyProvider;
8
use Jellyfish\SerializerSymfony\NameConverter\PropertyNameConverterStrategyProviderInterface;
9
use Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor;
10
use Symfony\Component\Serializer\Encoder\JsonEncoder;
11
use Symfony\Component\Serializer\Encoder\XmlEncoder;
12
use Symfony\Component\Serializer\Normalizer\ArrayDenormalizer;
13
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
14
use Symfony\Component\Serializer\Serializer as SymfonySerializer;
15
use Symfony\Component\Serializer\SerializerInterface as SymfonySerializerInterface;
16
17
class SerializerSymfonyFactory
18
{
19
    /**
20
     * @var \Jellyfish\SerializerSymfony\SerializerInterface
21
     */
22
    protected $serializer;
23
24
    /**
25
     * @var \Jellyfish\SerializerSymfony\NameConverter\PropertyNameConverterStrategyProviderInterface
26
     */
27
    protected $propertyNameConverterStrategyProvider;
28
29
    public function getSerializer(): SerializerInterface
30
    {
31
        if ($this->serializer === null) {
32
            $this->serializer = new Serializer($this->createSymfonySerializer());
33
        }
34
35
        return $this->serializer;
36
    }
37
38
    /**
39
     * @return \Symfony\Component\Serializer\SerializerInterface
40
     */
41
    protected function createSymfonySerializer(): SymfonySerializerInterface
42
    {
43
        return new SymfonySerializer(
44
            array_merge($this->createNormalizers(), $this->createDenormalizers()),
45
            $this->createEncoders()
46
        );
47
    }
48
49
    /**
50
     * @return \Symfony\Component\Serializer\Normalizer\NormalizerInterface[]
51
     */
52
    protected function createNormalizers(): array
53
    {
54
        return [
55
            new ObjectNormalizer(null, $this->createPropertyNameConverter(), null, new PhpDocExtractor())
56
        ];
57
    }
58
59
    /**
60
     * @return \Symfony\Component\Serializer\Normalizer\DenormalizerInterface[]
61
     */
62
    protected function createDenormalizers(): array
63
    {
64
        return [
65
            new ArrayDenormalizer()
66
        ];
67
    }
68
69
    /**
70
     * @return \Symfony\Component\Serializer\Encoder\EncoderInterface[]
71
     */
72
    protected function createEncoders(): array
73
    {
74
        return [
75
            new JsonEncoder(),
76
            new XmlEncoder()
77
        ];
78
    }
79
80
    /**
81
     * @return \Jellyfish\SerializerSymfony\NameConverter\PropertyNameConverterInterface
82
     */
83
    protected function createPropertyNameConverter(): PropertyNameConverterInterface
84
    {
85
        return new PropertyNameConverter($this->getPropertyNameConverterStrategyProvider());
86
    }
87
88
    /**
89
     * @return \Jellyfish\SerializerSymfony\NameConverter\PropertyNameConverterStrategyProviderInterface
90
     */
91
    public function getPropertyNameConverterStrategyProvider(): PropertyNameConverterStrategyProviderInterface
92
    {
93
        if ($this->propertyNameConverterStrategyProvider === null) {
94
            $this->propertyNameConverterStrategyProvider = new PropertyNameConverterStrategyProvider();
95
        }
96
97
        return $this->propertyNameConverterStrategyProvider;
98
    }
99
}
100