Completed
Push — master ( c30196...c6c53c )
by Sebastian
02:58 queued 01:02
created

AbstractResourceRouter::addResource()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 1
1
<?php
2
namespace Kartenmacherei\RestFramework\Router;
3
4
use Kartenmacherei\RestFramework\Request\Request;
5
use Kartenmacherei\RestFramework\Request\UnauthorizedException;
6
use Kartenmacherei\RestFramework\RestResource\RestResource;
7
8
abstract class AbstractResourceRouter implements ResourceRouter
9
{
10
    /**
11
     * @var ResourceRouter
12
     */
13
    private $next;
14
15
    /**
16
     * @var Acl
17
     */
18
    private $acl;
19
20
    /**
21
     * @var RestResource[]
22
     */
23
    private $resources = [];
24
25
    /**
26
     * @param Acl $acl
27
     */
28
    public function __construct(Acl $acl = null)
29
    {
30
        $this->acl = $acl;
31
    }
32
33
    /**
34
     * @param RestResource $resource
35
     */
36
    public function addResource(RestResource $resource)
37
    {
38
        $this->resources[] = $resource;
39
    }
40
41
    /**
42
     * @param Request $request
43
     * @return RestResource
44
     * @throws NoMoreRoutersException
45
     */
46
    public function route(Request $request): RestResource
47
    {
48
        if ($this->canRoute($request)) {
49
            $this->protect($request);
50
            return $this->doRoute($request);
51
        }
52
        if (null !== $this->next) {
53
            return $this->next->route($request);
54
        }
55
        throw new NoMoreRoutersException();
56
    }
57
58
    /**
59
     * @param Request $request
60
     * @throws UnauthorizedException
61
     */
62
    private function protect(Request $request)
63
    {
64
        if (null === $this->acl || $request->isOptionsRequest()) {
65
            return;
66
        }
67
68
        if (!$this->acl->complies($request)) {
69
            throw new UnauthorizedException();
70
        }
71
    }
72
73
    /**
74
     * @return RestResource[]
75
     */
76
    protected function getResources()
77
    {
78
        return $this->resources;
79
    }
80
81
    /**
82
     * @param ResourceRouter $router
83
     */
84
    public function setNext(ResourceRouter $router)
85
    {
86
        $this->next = $router;
87
    }
88
89
    /**
90
     * @param Request $request
91
     * @return bool
92
     */
93
    abstract protected function canRoute(Request $request): bool;
94
95
    /**
96
     * @param Request $request
97
     * @return RestResource
98
     * @throws NoMoreRoutersException
99
     */
100
    protected function doRoute(Request $request): RestResource
101
    {
102
        foreach ($this->getResources() as $resource) {
103
            if ($resource->isIdentifiedBy($request->getUri())) {
104
                return $resource;
105
            }
106
        }
107
        throw new NoMoreRoutersException();
108
    }
109
}
110