Completed
Push — master ( d9d1e2...b73c31 )
by Ruben
01:14
created

RouteLinkType::getLinks()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 15
rs 9.7666
c 0
b 0
f 0
cc 1
nc 1
nop 1
1
<?php
2
3
namespace Spatie\ResourceLinks\LinkTypes;
4
5
use Spatie\ResourceLinks\Serializers\LinkContainer;
6
use Spatie\ResourceLinks\Serializers\Serializer;
7
use Spatie\ResourceLinks\ParameterResolver;
8
use Illuminate\Database\Eloquent\Model;
9
use Illuminate\Routing\Route;
10
use Spatie\ResourceLinks\UrlResolver;
11
12
class RouteLinkType extends LinkType
13
{
14
    /** @var \Illuminate\Routing\Route */
15
    protected $route;
16
17
    /** @var string|null */
18
    protected $httpVerb;
19
20
    /** @var string|null */
21
    protected $name;
22
23
    public static function make(Route $route): RouteLinkType
24
    {
25
        return new self($route);
26
    }
27
28
    public function __construct(Route $route)
29
    {
30
        $this->route = $route;
31
    }
32
33
    public function httpVerb(?string $httpVerb): RouteLinkType
34
    {
35
        $this->httpVerb = $httpVerb;
36
37
        return $this;
38
    }
39
40
    public function name(?string $name): RouteLinkType
41
    {
42
        $this->name = $name;
43
44
        return $this;
45
    }
46
47
    public function getLinks(Model $model = null): array
48
    {
49
        $parameterResolver = new ParameterResolver($model, $this->parameters);
50
51
        $urlResolver = new UrlResolver(app('url'));
52
53
        $linkContainer = LinkContainer::make(
54
            $this->name ?? $this->route->getActionMethod(),
55
            $this->httpVerb ?? $this->getHttpVerbForRoute($this->route),
56
            $urlResolver->resolve($this->route, $parameterResolver->forRoute($this->route)),
57
            $this->prefix
58
        );
59
60
        return $this->resolveSerializer()->format($linkContainer);
61
    }
62
63
    private function getHttpVerbForRoute(Route $route): string
64
    {
65
        $httpVerbs = $route->methods;
66
67
        if ($httpVerbs === ['GET', 'HEAD']) {
68
            return 'GET';
69
        }
70
71
        return $httpVerbs[0];
72
    }
73
74
    private function resolveSerializer(): Serializer
75
    {
76
        $serializer = is_null($this->serializer)
77
            ? config('resource-links.serializer')
78
            : $this->serializer;
79
80
        return new $serializer;
81
    }
82
}
83