Responder   A
last analyzed

Complexity

Total Complexity 13

Size/Duplication

Total Lines 90
Duplicated Lines 0 %

Importance

Changes 6
Bugs 1 Features 0
Metric Value
eloc 27
c 6
b 1
f 0
dl 0
loc 90
rs 10
wmc 13

5 Methods

Rating   Name   Duplication   Size   Complexity  
A respondForModel() 0 7 2
A __construct() 0 6 1
A respond() 0 15 4
A respondForCollection() 0 11 3
A respondForPaginator() 0 11 3
1
<?php
2
3
namespace Signifly\Responder;
4
5
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
6
use Illuminate\Contracts\Support\Responsable;
7
use Illuminate\Database\Eloquent\Model;
8
use Illuminate\Http\Resources\Json\JsonResource;
9
use Illuminate\Support\Collection;
10
use Signifly\Responder\Contracts\ModelResolver;
11
use Signifly\Responder\Contracts\ResourceResolver;
12
use Signifly\Responder\Contracts\Responder as Contract;
13
use Signifly\Responder\Responses\CollectionResponse;
14
use Signifly\Responder\Responses\DefaultResponse;
15
use Signifly\Responder\Responses\ModelResponse;
16
use Signifly\Responder\Responses\PaginatorResponse;
17
18
class Responder implements Contract
19
{
20
    /** @var \Signifly\Responder\Contracts\ModelResolver */
21
    protected $modelResolver;
22
23
    /** @var \Signifly\Responder\Contracts\ResourceResolver */
24
    protected $resourceResolver;
25
26
    public function __construct(
27
        ModelResolver $modelResolver,
28
        ResourceResolver $resourceResolver
29
    ) {
30
        $this->modelResolver = $modelResolver;
31
        $this->resourceResolver = $resourceResolver;
32
    }
33
34
    /**
35
     * Respond to data.
36
     *
37
     * @param  mixed $data
38
     * @return \Illuminate\Contracts\Support\Responsable
39
     */
40
    public function respond($data, ?string $resourceClass = null): Responsable
41
    {
42
        if ($data instanceof Collection) {
43
            return $this->respondForCollection($data, $resourceClass);
44
        }
45
46
        if ($data instanceof Model) {
47
            return $this->respondForModel($data, $resourceClass);
48
        }
49
50
        if ($data instanceof LengthAwarePaginator) {
51
            return $this->respondForPaginator($data, $resourceClass);
52
        }
53
54
        return new DefaultResponse($data, $resourceClass);
55
    }
56
57
    /**
58
     * Respond for a collection.
59
     *
60
     * @param  \Illuminate\Support\Collection $data
61
     * @return \Signifly\Responder\Responses\CollectionResponse
62
     */
63
    protected function respondForCollection(Collection $data, ?string $resourceClass)
64
    {
65
        if (is_null($resourceClass)) {
66
            $modelClass = $this->modelResolver->resolve($data, 'collection');
67
68
            $resourceClass = empty($modelClass)
69
                ? config('responder.default_resource', JsonResource::class)
70
                : $this->resourceResolver->resolve($modelClass);
71
        }
72
73
        return new CollectionResponse($data, $resourceClass);
74
    }
75
76
    /**
77
     * Respond for a given model.
78
     *
79
     * @param  \Illuminate\Database\Eloquent\Model  $model
80
     * @return \Signifly\Responder\Responses\ModelResponse
81
     */
82
    protected function respondForModel(Model $model, ?string $resourceClass)
83
    {
84
        if (is_null($resourceClass)) {
85
            $resourceClass = $this->resourceResolver->resolve(get_class($model));
86
        }
87
88
        return new ModelResponse($model, $resourceClass);
89
    }
90
91
    /**
92
     * Respond for a paginator.
93
     *
94
     * @param  \Illuminate\Contracts\Pagination\LengthAwarePaginator $data
95
     * @return \Signifly\Responder\Responses\PaginatorResponse
96
     */
97
    protected function respondForPaginator(LengthAwarePaginator $data, ?string $resourceClass)
98
    {
99
        if (is_null($resourceClass)) {
100
            $modelClass = $this->modelResolver->resolve($data, 'paginator');
101
102
            $resourceClass = empty($modelClass)
103
                ? config('responder.default_resource', JsonResource::class)
104
                : $this->resourceResolver->resolve($modelClass);
105
        }
106
107
        return new PaginatorResponse($data, $resourceClass);
108
    }
109
}
110