Completed
Push — master ( 2d2f76...c06362 )
by Sebastian
02:09
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
     * @param ResourceRouter $router
75
     */
76
    public function setNext(ResourceRouter $router)
77
    {
78
        $this->next = $router;
79
    }
80
81
    /**
82
     * @param Request $request
83
     * @return bool
84
     */
85
    abstract protected function canRoute(Request $request): bool;
86
87
    /**
88
     * @param Request $request
89
     * @return RestResource
90
     * @throws NoMoreRoutersException
91
     */
92
    protected function doRoute(Request $request): RestResource
93
    {
94
        foreach ($this->resources as $resource) {
95
            if ($resource->isIdentifiedBy($request->getUri())) {
96
                return $resource;
97
            }
98
        }
99
        throw new NoMoreRoutersException();
100
    }
101
}
102