ClassHydrator::hydrateResource()   B
last analyzed

Complexity

Conditions 8
Paths 16

Size

Total Lines 30
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 8
eloc 19
nc 16
nop 3
dl 0
loc 30
rs 8.4444
c 0
b 0
f 0
1
<?php
2
namespace Javis\JsonApi\Hydrator;
3
4
use stdClass;
5
use Javis\JsonApi\Schema\Document;
6
use Javis\JsonApi\Schema\Resource;
7
8
/**
9
 * Imported from WoohooLabs Yang to bring this feature to PHP 5.5
10
 */
11
class ClassHydrator
12
{
13
    /**
14
     * @return stdClass[]|stdClass
15
     */
16
17
    public function hydrate(Document $document)
18
    {
19
        if ($document->hasPrimaryResources() === false) {
20
            return new stdClass();
21
        }
22
        if ($document->isSingleResourceDocument()) {
23
            return $this->hydratePrimaryResource($document);
24
        }
25
        return $this->hydratePrimaryResources($document);
26
    }
27
28
    public function hydrateObject(Document $document)
29
    {
30
        if ($document->isSingleResourceDocument() === false) {
31
            return new stdClass();
32
        }
33
        if ($document->hasPrimaryResources() === false) {
34
            return new stdClass();
35
        }
36
        return $this->hydratePrimaryResource($document);
37
    }
38
39
    /**
40
     * @return stdClass[]
41
     */
42
    public function hydrateCollection(Document $document)
43
    {
44
        if ($document->hasPrimaryResources() === false) {
45
            return [];
46
        }
47
        if ($document->isSingleResourceDocument()) {
48
            return [$this->hydratePrimaryResource($document)];
49
        }
50
        return $this->hydratePrimaryResources($document);
51
    }
52
53
    private function hydratePrimaryResources(Document $document)
54
    {
55
        $result = [];
56
        $resourceMap = [];
57
        foreach ($document->primaryResources() as $primaryResource) {
58
            $result[] = $this->hydrateResource($primaryResource, $document, $resourceMap);
59
        }
60
        return $result;
61
    }
62
63
    private function hydratePrimaryResource(Document $document)
64
    {
65
        $resourceMap = [];
66
        return $this->hydrateResource(/** @scrutinizer ignore-type */ $document->primaryResource(), $document, $resourceMap);
67
    }
68
69
    /**
70
     * @param stdClass[] $resourceMap
71
     */
72
    private function hydrateResource(Resource $resource, Document $document, array &$resourceMap)
73
    {
74
        // Fill basic attributes of the resource
75
        $result = new stdClass();
76
        $result->type = $resource->type();
77
        $result->id = $resource->id();
78
        foreach ($resource->attributes() as $attribute => $value) {
79
            $result->{$attribute} = $value;
80
        }
81
        //Save resource to the identity map
82
        $this->saveObjectToMap($result, $resourceMap);
83
        //Fill relationships
84
        foreach ($resource->relationships() as $name => $relationship) {
85
            foreach ($relationship->resourceLinks() as $link) {
86
                $object = $this->getObjectFromMap($link["type"], $link["id"], $resourceMap);
87
                if ($object === null && $document->hasIncludedResource($link["type"], $link["id"])) {
88
                    $relatedResource = $document->resource($link["type"], $link["id"]);
89
                    $object = $this->hydrateResource($relatedResource, $document, $resourceMap);
90
                }
91
                if ($object === null) {
92
                    continue;
93
                }
94
                if ($relationship->isToOneRelationship()) {
95
                    $result->{$name} = $object;
96
                } else {
97
                    $result->{$name}[] = $object;
98
                }
99
            }
100
        }
101
        return $result;
102
    }
103
104
    /**
105
     * @param stdClass[] $resourceMap
106
     */
107
    private function getObjectFromMap($type, $id, array $resourceMap)
108
    {
109
        return !empty($resourceMap[$type . "-" . $id]) ? $resourceMap[$type . "-" . $id] : null;
110
    }
111
112
    /**
113
     * @param stdClass[] $resourceMap
114
     */
115
    private function saveObjectToMap($object, array &$resourceMap)
116
    {
117
        $resourceMap[$object->type . "-" . $object->id] = $object;
118
    }
119
}
120