Test Setup Failed
Push — v2 ( 74186a...c94b75 )
by Alexander
06:56
created

ResourceFactory::instatiateResource()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 10
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 6
nc 3
nop 3
dl 0
loc 10
rs 9.4285
c 0
b 0
f 0
1
<?php
2
3
namespace Flugg\Responder\Resources;
4
5
use Flugg\Responder\Contracts\Resources\ResourceFactory as ResourceFactoryContract;
6
use Flugg\Responder\Contracts\Transformers\TransformerResolver;
7
use Flugg\Responder\Transformers\TransformerManager;
8
use League\Fractal\Resource\Collection as CollectionResource;
9
use League\Fractal\Resource\Item as ItemResource;
10
use League\Fractal\Resource\NullResource;
11
use League\Fractal\Resource\ResourceInterface;
12
13
/**
14
 * This class is responsible for making Fractal resources from a variety of data types.
15
 *
16
 * @package flugger/laravel-responder
17
 * @author  Alexander Tømmerås <[email protected]>
18
 * @license The MIT License
19
 */
20
class ResourceFactory implements ResourceFactoryContract
21
{
22
    /**
23
     * A service class, used to normalize data.
24
     *
25
     * @var \Flugg\Responder\DataNormalizer
26
     */
27
    protected $normalizer;
28
29
    /**
30
     * A manager class, used to manage transformers.
31
     *
32
     * @var \Flugg\Responder\Contracts\Transformers\TransformerResolver
33
     */
34
    protected $transformerResolver;
35
36
    /**
37
     * Construct the factory class.
38
     *
39
     * @param \Flugg\Responder\Resources\DataNormalizer                   $normalizer
40
     * @param \Flugg\Responder\Contracts\Transformers\TransformerResolver $transformerResolver
41
     */
42
    public function __construct(DataNormalizer $normalizer, TransformerResolver $transformerResolver)
43
    {
44
        $this->normalizer = $normalizer;
0 ignored issues
show
Documentation Bug introduced by
It seems like $normalizer of type object<Flugg\Responder\Resources\DataNormalizer> is incompatible with the declared type object<Flugg\Responder\DataNormalizer> of property $normalizer.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
45
        $this->transformerResolver = $transformerResolver;
46
    }
47
48
    /**
49
     * Make resource from the given data.
50
     *
51
     * @param  mixed                                                          $data
52
     * @param  \Flugg\Responder\Transformers\Transformer|string|callable|null $transformer
53
     * @param  string|null                                                    $resourceKey
54
     * @return \League\Fractal\Resource\ResourceInterface
55
     */
56
    public function make($data = null, $transformer = null, string $resourceKey = null): ResourceInterface
57
    {
58
        if (is_null($data = $this->normalizer->normalize($data))) {
59
            return $this->instatiateResource($data);
60
        }
61
62
        $transformer = $this->resolveTransformer($data, $transformer);
63
64
        return $this->instatiateResource($data, $transformer, $resourceKey);
65
    }
66
67
    /**
68
     * Resolve a transformer.
69
     *
70
     * @param  mixed                                                          $data
71
     * @param  \Flugg\Responder\Transformers\Transformer|string|callable|null $transformer
72
     * @return \Flugg\Responder\Transformers\Transformer|callable
0 ignored issues
show
Documentation introduced by
Should the return type not be callable|null?

This check compares the return type specified in the @return annotation of a function or method doc comment with the types returned by the function and raises an issue if they mismatch.

Loading history...
73
     */
74
    protected function resolveTransformer($data, $transformer)
75
    {
76
        if (isset($transformer)) {
77
            return $this->transformerResolver->resolve($transformer);
78
        }
79
80
        return $this->transformerResolver->resolveFromData($data);
81
    }
82
83
    /**
84
     * Instatiate a new resource instance.
85
     *
86
     * @param  mixed                                                   $data
87
     * @param  \Flugg\Responder\Transformers\Transformer|callable|null $transformer
88
     * @param  string|null                                             $resourceKey
89
     * @return \League\Fractal\Resource\ResourceInterface
90
     */
91
    protected function instatiateResource($data, $transformer = null, string $resourceKey = null): ResourceInterface
92
    {
93
        if (is_null($data)) {
94
            return new NullResource();
95
        } elseif (is_iterable($data)) {
96
            return new CollectionResource($data, $transformer, $resourceKey);
97
        }
98
99
        return new ItemResource($data, $transformer, $resourceKey);
100
    }
101
}