SerializerBuilder   A
last analyzed

Complexity

Total Complexity 21

Size/Duplication

Total Lines 145
Duplicated Lines 0 %

Test Coverage

Coverage 41.79%

Importance

Changes 0
Metric Value
dl 0
loc 145
ccs 28
cts 67
cp 0.4179
rs 10
c 0
b 0
f 0
wmc 21

11 Methods

Rating   Name   Duplication   Size   Complexity  
A addMetadataDir() 0 11 1
A removeSerializationHandler() 0 13 3
B build() 0 28 5
A addEventSubscribers() 0 7 1
A removeEventSubscribers() 0 13 3
A removeMetadataDir() 0 13 3
A setObjectConstructor() 0 5 1
A __construct() 0 4 1
A configureDefaults() 0 6 1
A createByConfig() 0 3 1
A addSerializationHandler() 0 7 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace CCT\Kong\Serializer;
6
7
use CCT\Kong\Config;
8
use JMS\Serializer\Construction\ObjectConstructorInterface;
9
use JMS\Serializer\EventDispatcher\EventDispatcher;
10
use JMS\Serializer\EventDispatcher\EventSubscriberInterface;
11
use JMS\Serializer\Handler\HandlerRegistry;
12
use JMS\Serializer\Handler\SubscribingHandlerInterface;
13
use JMS\Serializer\SerializerInterface;
14
use JMS\Serializer\SerializerBuilder as JMSSerializerBuilder;
15
16
class SerializerBuilder implements SerializerBuilderInterface
17
{
18
    /**
19
     * @var Config
20
     */
21
    protected $config;
22
23
    /**
24
     * @var JMSSerializerBuilder
25
     */
26
    protected $jmsSerializerBuilder;
27
28 2
    public function __construct(Config $config)
29
    {
30 2
        $this->config = $config;
31 2
        $this->jmsSerializerBuilder = JMSSerializerBuilder::create();
32 2
    }
33
34 2
    public static function createByConfig(Config $config)
35
    {
36 2
        return new static($config);
37
    }
38
39
    public function addMetadataDir($dir, $namespacePrefix)
40
    {
41
        $metadataDirs = $this->config->get(Config::METADATA_DIRS, []);
42
        $metadataDirs[] = [
43
            'dir' => $dir,
44
            'namespacePrefix' => $namespacePrefix
45
        ];
46
47
        $this->config->set(Config::METADATA_DIRS, $metadataDirs);
48
49
        return $this;
50
    }
51
52
    public function removeMetadataDir($dir)
53
    {
54
        $metadataDirs = $this->config->get(Config::METADATA_DIRS, []);
55
56
        foreach ($metadataDirs as $key => $metadataDir) {
57
            if ($metadataDir['dir'] == $dir) {
58
                unset($metadataDirs[$key]);
59
            }
60
        }
61
62
        $this->config->set(Config::METADATA_DIRS, $metadataDirs);
63
64
        return $this;
65
    }
66
67
    public function addEventSubscribers(EventSubscriberInterface $eventSubscriber)
68
    {
69
        $this->config->merge([
0 ignored issues
show
Bug introduced by
The method merge() does not exist on CCT\Kong\Config. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

69
        $this->config->/** @scrutinizer ignore-call */ 
70
                       merge([

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
70
            Config::EVENT_SUBSCRIBERS => [$eventSubscriber]
71
        ]);
72
73
        return $this;
74
    }
75
76
    public function removeEventSubscribers(EventSubscriberInterface $eventSubscriber)
77
    {
78
        $eventSubscribers = $this->config->get(Config::EVENT_SUBSCRIBERS, []);
79
80
        foreach ($eventSubscribers as $key => $storedEventSubscribers) {
81
            if (get_class($storedEventSubscribers) === get_class($eventSubscriber)) {
82
                unset($eventSubscribers[$key]);
83
            }
84
        }
85
86
        $this->config->set(Config::EVENT_SUBSCRIBERS, $eventSubscribers);
87
88
        return $this;
89
    }
90
91
    public function addSerializationHandler(SubscribingHandlerInterface $subscribingHandler)
92
    {
93
        $this->config->merge([
94
            Config::SERIALIZATION_HANDLERS => [$subscribingHandler]
95
        ]);
96
97
        return $this;
98
    }
99
100
    public function removeSerializationHandler(SubscribingHandlerInterface $subscribingHandler)
101
    {
102
        $subscribingHandlers = $this->config->get(Config::SERIALIZATION_HANDLERS, []);
103
104
        foreach ($subscribingHandlers as $key => $storedSubscribingHandlers) {
105
            if (get_class($storedSubscribingHandlers) === get_class($subscribingHandler)) {
106
                unset($subscribingHandlers[$key]);
107
            }
108
        }
109
110
        $this->config->set(Config::SERIALIZATION_HANDLERS, $subscribingHandlers);
111
112
        return $this;
113
    }
114
115
    public function setObjectConstructor(ObjectConstructorInterface $objectConstructor)
116
    {
117
        $this->config->set(Config::OBJECT_CONSTRUCTOR, $objectConstructor);
118
119
        return $this;
120
    }
121
122 2
    public function configureDefaults()
123
    {
124 2
        $this->jmsSerializerBuilder->addDefaultHandlers();
125 2
        $this->jmsSerializerBuilder->addDefaultListeners();
126
127 2
        return $this;
128
    }
129
130
    /**
131
     * {@inheritdoc}
132
     */
133 2
    public function build(): SerializerInterface
134
    {
135 2
        $this->jmsSerializerBuilder->setDebug($this->config->get('debug', false));
136
137 2
        foreach ($this->config->get(Config::METADATA_DIRS, []) as $metadataDir) {
138 2
            $this->jmsSerializerBuilder->addMetadataDir($metadataDir['dir'], $metadataDir['namespacePrefix']);
139
        }
140
141 2
        $eventSubscribers = $this->config->get(Config::EVENT_SUBSCRIBERS, []);
142 2
        $this->jmsSerializerBuilder->configureListeners(function (EventDispatcher $dispatcher) use ($eventSubscribers) {
143 2
            foreach ($eventSubscribers as $eventSubscriber) {
144 1
                $dispatcher->addSubscriber($eventSubscriber);
145
            }
146 2
        });
147
148 2
        $serializationHandlers = $this->config->get(Config::SERIALIZATION_HANDLERS, []);
149 2
        $this->jmsSerializerBuilder->configureHandlers(function (HandlerRegistry $handlerRegistry) use ($serializationHandlers) {
150 2
            foreach ($serializationHandlers as $handler) {
151 2
                $handlerRegistry->registerSubscribingHandler($handler);
152
            }
153 2
        });
154
155 2
        $objectConstructor = $this->config->get(Config::OBJECT_CONSTRUCTOR, null);
156 2
        if (null !== $objectConstructor) {
157 1
            $this->jmsSerializerBuilder->setObjectConstructor($objectConstructor);
158
        }
159
160 2
        return $this->jmsSerializerBuilder->build();
161
    }
162
}
163