Fractal::create()   B
last analyzed

Complexity

Conditions 10
Paths 90

Size

Total Lines 45
Code Lines 22

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 22
CRAP Score 10

Importance

Changes 4
Bugs 0 Features 0
Metric Value
eloc 22
c 4
b 0
f 0
dl 0
loc 45
ccs 22
cts 22
cp 1
rs 7.6666
cc 10
nc 90
nop 3
crap 10

How to fix   Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
namespace Spatie\Fractal;
4
5
use Closure;
6
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
7
use Illuminate\Http\JsonResponse;
8
use Illuminate\Support\Traits\Macroable;
9
use League\Fractal\Manager;
10
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
11
use League\Fractal\Serializer\JsonApiSerializer;
12
use League\Fractal\Serializer\SerializerAbstract;
13
use Spatie\Fractalistic\Fractal as Fractalistic;
14
15
class Fractal extends Fractalistic
16
{
17
    use Macroable {
0 ignored issues
show
Bug introduced by
The trait Illuminate\Support\Traits\Macroable requires the property $name which is not provided by Spatie\Fractal\Fractal.
Loading history...
18
        Macroable::__call as macroCall;
19
    }
20
21
    /** @param \League\Fractal\Manager $manager */
22
    public function __construct(Manager $manager)
23 228
    {
24
        parent::__construct($manager);
25 228
    }
26 228
27
    /**
28
     * @param null|mixed $data
29
     * @param null|callable|\League\Fractal\TransformerAbstract $transformer
30
     * @param null|\League\Fractal\Serializer\SerializerAbstract $serializer
31
     *
32
     * @return \Spatie\Fractalistic\Fractal
33
     */
34
    public static function create($data = null, $transformer = null, $serializer = null)
35 228
    {
36
        $fractal = parent::create($data, $transformer, $serializer);
37 228
38
        if (config('fractal.auto_includes.enabled')) {
39 228
            $requestKey = config('fractal.auto_includes.request_key');
40 228
41
            if ($include = app('request')->query($requestKey)) {
42 228
                $fractal->parseIncludes($include);
43 12
            }
44
        }
45
46
        if (empty($serializer)) {
47 228
            $serializer = config('fractal.default_serializer');
48 228
        }
49
50
        if ($data instanceof LengthAwarePaginator) {
51 228
            $paginator = config('fractal.default_paginator');
52 12
53
            if (empty($paginator)) {
54 12
                $paginator = IlluminatePaginatorAdapter::class;
55 6
            }
56
57
            $fractal->paginateWith(new $paginator($data));
58 12
        }
59
60
        if (empty($serializer)) {
61 228
            return $fractal;
62 186
        }
63
64
        if ($serializer instanceof SerializerAbstract) {
65 78
            return $fractal->serializeWith($serializer);
66 12
        }
67
68
        if ($serializer instanceof Closure) {
69 72
            return $fractal->serializeWith($serializer());
70 12
        }
71
72
        if ($serializer == JsonApiSerializer::class) {
73 60
            $baseUrl = config('fractal.base_url');
74 18
75
            return $fractal->serializeWith(new $serializer($baseUrl));
76 18
        }
77
78
        return $fractal->serializeWith(new $serializer);
79 42
    }
80
81
    /**
82
     * Return a new JSON response.
83
     *
84
     * @param  callable|int $statusCode
85
     * @param  callable|array $headers
86
     * @param  callable|int $options
87
     *
88
     * @return \Illuminate\Http\JsonResponse
89
     */
90
    public function respond($statusCode = 200, $headers = [], $options = 0)
91 102
    {
92
        $response = new JsonResponse();
93 102
94
        $response->setData($this->createData()->toArray());
95 102
96
        if (is_int($statusCode)) {
97 102
            $statusCode = function (JsonResponse $response) use ($statusCode) {
98 13
                return $response->setStatusCode($statusCode);
99 78
            };
100 78
        }
101
102
        if (is_array($headers)) {
103 102
            $headers = function (JsonResponse $response) use ($headers) {
104 14
                return $response->withHeaders($headers);
105 84
            };
106 84
        }
107
108
        if (is_int($options)) {
109 102
            $options = function (JsonResponse $response) use ($options) {
110 80
                $response->setEncodingOptions($options);
111 96
112
                return $response;
113 96
            };
114 96
        }
115
116
        if (is_callable($options)) {
117 102
            $options($response);
118 102
        }
119
120
        if (is_callable($statusCode)) {
121 102
            $statusCode($response);
122 102
        }
123
124
        if (is_callable($headers)) {
125 102
            $headers($response);
126 102
        }
127
128
        return $response;
129 102
    }
130
131
    public function __call($name, array $arguments)
132 6
    {
133
        if (static::hasMacro($name)) {
134 6
            return $this->macroCall($name, $arguments);
0 ignored issues
show
Bug introduced by
The method macroCall() does not exist on Spatie\Fractal\Fractal. Since you implemented __call, consider adding a @method annotation. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

134
            return $this->/** @scrutinizer ignore-call */ macroCall($name, $arguments);
Loading history...
135 6
        }
136
137
        return parent::__call($name, $arguments);
138
    }
139
}
140