RelationshipSerializer::toResourceLinkage()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 6
rs 9.4285
c 0
b 0
f 0
nc 1
cc 1
eloc 3
nop 0
1
<?php
2
3
namespace Huntie\JsonApi\Serializers;
4
5
use Huntie\JsonApi\Exceptions\InvalidRelationPathException;
6
use Illuminate\Database\Eloquent\Model;
7
use Illuminate\Support\Collection;
8
9
class RelationshipSerializer extends JsonApiSerializer
10
{
11
    /**
12
     * The resolved relation to transform.
13
     *
14
     * @var Collection|Model|null
15
     */
16
    protected $relation;
17
18
    /**
19
     * The subset of attributes to return on each resource type.
20
     *
21
     * @var array
22
     */
23
    protected $fields;
24
25
    /**
26
     * The named relationships to list on the resolved resource(s).
27
     *
28
     * @var array
29
     */
30
    protected $relationships;
31
32
    /**
33
     * Create a new JSON API relationship serializer.
34
     *
35
     * @param Model      $record        The primary record
36
     * @param string     $relation      The name of the relation to serialize
37
     * @param array|null $fields        The subset of fields to return on each resource type
38
     * @param array|null $relationships The named relationships to list on the resolved resource(s)
39
     *
40
     * @throws InvalidRelationPathException
41
     */
42
    public function __construct($record, $relation, array $fields = [], array $relationships = [])
43
    {
44
        parent::__construct();
45
46
        if (in_array($relation, $record->getHidden())) {
47
            throw new InvalidRelationPathException($relation);
48
        }
49
50
        $this->relation = $record->{$relation};
51
        $this->fields = array_unique($fields);
52
        $this->relationships = array_unique($relationships);
53
    }
54
55
    /**
56
     * Return a JSON API resource linkage representation, composed of a
57
     * resource identifier for each related record.
58
     *
59
     * @return Collection|array|null
60
     */
61
    public function toResourceLinkage()
62
    {
63
        return $this->map(function ($record) {
64
            return (new ResourceSerializer($record))->toResourceIdentifier();
65
        });
66
    }
67
68
    /**
69
     * Return a single, or collection of, JSON API resource objects for each
70
     * record in the relationship.
71
     *
72
     * @return Collection|array|null
73
     */
74
    public function toResourceCollection()
75
    {
76
        return $this->map(function ($record) {
77
            return (new ResourceSerializer($record, $this->fields, [], $this->relationships))
78
                ->toResourceObject();
79
        });
80
    }
81
82
    /**
83
     * Return primary data for the JSON API document.
84
     *
85
     * @return mixed
86
     */
87
    protected function getPrimaryData()
88
    {
89
        return $this->toResourceLinkage();
90
    }
91
92
    /**
93
     * Run a map over each item in the relationship.
94
     *
95
     * @param callable $callback
96
     *
97
     * @return mixed
98
     */
99
    protected function map(callable $callback)
100
    {
101
        if ($this->relation instanceof Collection) {
102
            return $this->relation->map($callback);
103
        } else if ($this->relation instanceof Model) {
104
            return call_user_func($callback, $this->relation);
105
        }
106
107
        return null;
108
    }
109
}
110