Completed
Push — master ( bbe9c9...dc72bb )
by Ruben
01:46
created

RouteLinkType::getAction()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 13
rs 9.8333
c 0
b 0
f 0
cc 2
nc 2
nop 2
1
<?php
2
3
namespace Spatie\ResourceLinks\LinkTypes;
4
5
use Illuminate\Routing\Route;
6
use Spatie\ResourceLinks\UrlResolver;
7
use Illuminate\Database\Eloquent\Model;
8
use Spatie\ResourceLinks\LinkContainer;
9
use Spatie\ResourceLinks\ParameterResolver;
10
use Spatie\ResourceLinks\Serializers\Serializer;
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
            $this->getAction($urlResolver, $parameterResolver),
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 getAction(
75
        UrlResolver $urlResolver,
76
        ParameterResolver $parameterResolver
77
    ): string {
78
        $action = $urlResolver->resolve(
79
            $this->route,
80
            $parameterResolver->forRoute($this->route)
81
        );
82
83
        return $this->query !== null
84
            ? "{$action}?{$this->query}"
85
            : $action;
86
    }
87
88
    private function resolveSerializer(): Serializer
89
    {
90
        $serializer = is_null($this->serializer)
91
            ? config('resource-links.serializer')
92
            : $this->serializer;
93
94
        return new $serializer;
95
    }
96
}
97