Completed
Pull Request — master (#1358)
by Guilh
07:06
created

JMSSerializerAdapter   A

Complexity

Total Complexity 12

Size/Duplication

Total Lines 78
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 4

Test Coverage

Coverage 58.33%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 12
c 1
b 0
f 0
lcom 1
cbo 4
dl 0
loc 78
ccs 21
cts 36
cp 0.5833
rs 10

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A serialize() 0 6 1
A deserialize() 0 6 1
D convertContext() 0 33 9
1
<?php
2
3
/*
4
 * This file is part of the FOSRestBundle package.
5
 *
6
 * (c) FriendsOfSymfony <http://friendsofsymfony.github.com/>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace FOS\RestBundle\Serializer;
13
14
use FOS\RestBundle\Context\Context;
15
use JMS\Serializer\Context as JMSContext;
16
use JMS\Serializer\DeserializationContext as JMSDeserializationContext;
17
use JMS\Serializer\SerializationContext as JMSSerializationContext;
18
use JMS\Serializer\SerializerInterface;
19
20
/**
21
 * Adapter to plug the JMS serializer into the FOSRestBundle Serializer API.
22
 *
23
 * @author Christian Flothmann <[email protected]>
24
 */
25
class JMSSerializerAdapter implements Serializer
26
{
27
    /**
28
     * @internal
29
     */
30
    const SERIALIZATION = 0;
31
    /**
32
     * @internal
33
     */
34
    const DESERIALIZATION = 1;
35
36
    private $serializer;
37
38 4
    public function __construct(SerializerInterface $serializer)
39
    {
40 4
        $this->serializer = $serializer;
41 4
    }
42
43
    /**
44
     * {@inheritdoc}
45
     */
46 4
    public function serialize($data, $format, Context $context)
47
    {
48 4
        $context = $this->convertContext($context, self::SERIALIZATION);
49
50 4
        return $this->serializer->serialize($data, $format, $context);
0 ignored issues
show
Bug introduced by
It seems like $context defined by $this->convertContext($c...t, self::SERIALIZATION) on line 48 can also be of type object<JMS\Serializer\DeserializationContext>; however, JMS\Serializer\SerializerInterface::serialize() does only seem to accept null|object<JMS\Serializer\SerializationContext>, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
51
    }
52
53
    /**
54
     * {@inheritdoc}
55
     */
56
    public function deserialize($data, $type, $format, Context $context)
57
    {
58
        $context = $this->convertContext($context, self::DESERIALIZATION);
59
60
        return $this->serializer->deserialize($data, $type, $format, $context);
0 ignored issues
show
Bug introduced by
It seems like $context defined by $this->convertContext($c... self::DESERIALIZATION) on line 58 can also be of type object<JMS\Serializer\SerializationContext>; however, JMS\Serializer\SerializerInterface::deserialize() does only seem to accept null|object<JMS\Serializ...DeserializationContext>, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
61
    }
62
63
    /**
64
     * @param Context $context
65
     * @param int     $direction {@see self} constants
66
     *
67
     * @return JMSContext
68
     */
69 4
    private function convertContext(Context $context, $direction)
70
    {
71 4
        if ($direction === self::SERIALIZATION) {
72 4
            $jmsContext = JMSSerializationContext::create();
73 4
        } else {
74
            $jmsContext = JMSDeserializationContext::create();
75
            if (null !== $context->getMaxDepth()) {
76
                for ($i = 0; $i < $context->getMaxDepth(); ++$i) {
77
                    $jmsContext->increaseDepth();
78
                }
79
            }
80
        }
81
82 4
        foreach ($context->getAttributes() as $key => $value) {
83 4
            $jmsContext->attributes->set($key, $value);
84 4
        }
85
86 4
        if (null !== $context->getVersion()) {
87
            $jmsContext->setVersion($context->getVersion());
88
        }
89 4
        $groups = $context->getGroups();
90 4
        if (!empty($groups)) {
91
            $jmsContext->setGroups($context->getGroups());
92
        }
93 4
        if (null !== $context->getMaxDepth()) {
94
            $jmsContext->enableMaxDepthChecks();
95
        }
96 4
        if (null !== $context->getSerializeNull()) {
97 4
            $jmsContext->setSerializeNull($context->getSerializeNull());
98 4
        }
99
100 4
        return $jmsContext;
101
    }
102
}
103