Completed
Push — master ( e9eb67...a021d0 )
by Freek
01:29
created

ParameterResolver::resolveParameter()   A

Complexity

Conditions 6
Paths 5

Size

Total Lines 18

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 18
rs 9.0444
c 0
b 0
f 0
cc 6
nc 5
nop 2
1
<?php
2
3
namespace Spatie\LaravelEndpointResources;
4
5
use Illuminate\Database\Eloquent\Model;
6
use Illuminate\Routing\Exceptions\UrlGenerationException;
7
use Illuminate\Routing\Route;
8
use ReflectionParameter;
9
10
class ParameterResolver
11
{
12
    /** @var \Illuminate\Database\Eloquent\Model|null */
13
    protected $model;
14
15
    /** @var array */
16
    protected $defaultParameters;
17
18
    public function __construct(?Model $model, array $defaultParameters = [])
19
    {
20
        $this->model = $model;
21
22
        $this->defaultParameters = $defaultParameters;
23
    }
24
25
    public function forRoute(Route $route): array
26
    {
27
        $providedParameters = $this->getProvidedParameters();
28
29
        return collect($route->signatureParameters())
30
            ->mapWithKeys(function (ReflectionParameter $signatureParameter) use ($providedParameters) {
31
                return [
32
                    $signatureParameter->getName() => $this->resolveParameter(
33
                        $signatureParameter,
34
                        $providedParameters
35
                    ),
36
                ];
37
            })
38
            ->reject(function ($parameter) {
39
                return $parameter === null;
40
            })->all();
41
    }
42
43
    protected function getProvidedParameters(): array
44
    {
45
        return optional($this->model)->exists
46
            ? array_merge($this->defaultParameters, [$this->model])
47
            : $this->defaultParameters;
48
    }
49
50
    protected function resolveParameter(ReflectionParameter $signatureParameter, array $providedParameters)
51
    {
52
        if (array_key_exists($signatureParameter->getName(), $providedParameters)) {
53
            return $providedParameters[$signatureParameter->getName()];
54
        }
55
56
        foreach ($providedParameters as $providedParameter) {
57
            if (! is_object($providedParameter) || $signatureParameter->getType() === null) {
58
                continue;
59
            }
60
61
            if ($signatureParameter->getType()->getName() === get_class($providedParameter)) {
62
                return $providedParameter;
63
            }
64
        }
65
66
        return null;
67
    }
68
}
69