Passed
Push — develop ( 1647ec...9dc8e3 )
by Brent
06:58
created

Router::resolveHandler()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 14
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 2

Importance

Changes 0
Metric Value
cc 2
eloc 8
nc 2
nop 1
dl 0
loc 14
ccs 7
cts 7
cp 1
crap 2
rs 9.4285
c 0
b 0
f 0
1
<?php
2
3
namespace Stitcher\Application;
4
5
use FastRoute\Dispatcher;
6
use FastRoute\Dispatcher\GroupCountBased;
7
use FastRoute\RouteCollector;
8
use GuzzleHttp\Psr7\Request;
9
use GuzzleHttp\Psr7\Response;
10
use Stitcher\App;
11
use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
12
13
class Router
14
{
15
    protected $routeCollector;
16
17 4
    public function __construct(RouteCollector $routeCollector)
18
    {
19 4
        $this->routeCollector = $routeCollector;
20 4
    }
21
22 2
    public function get(string $url, string $controller): Router
23
    {
24 2
        $this->routeCollector->addRoute('GET', $url, [$controller, 'handle']);
25
26 2
        return $this;
27
    }
28
29
    public function put(string $url, string $controller): Router
30
    {
31
        $this->routeCollector->addRoute('PUT', $url, [$controller, 'handle']);
32
33
        return $this;
34
    }
35
36
    public function post(string $url, string $controller): Router
37
    {
38
        $this->routeCollector->addRoute('POST', $url, [$controller, 'handle']);
39
40
        return $this;
41
    }
42
43
    public function patch(string $url, string $controller): Router
44
    {
45
        $this->routeCollector->addRoute('PATCH', $url, [$controller, 'handle']);
46
47
        return $this;
48
    }
49
50
    public function delete(string $url, string $controller): Router
51
    {
52
        $this->routeCollector->addRoute('DELETE', $url, [$controller, 'handle']);
53
54
        return $this;
55
    }
56
57 1
    public function dispatch(Request $request): ?Response
58
    {
59 1
        $dispatcher = new GroupCountBased($this->routeCollector->getData());
60
61 1
        $routeInfo = $dispatcher->dispatch($request->getMethod(), $request->getUri()->getPath());
62
63 1
        if ($routeInfo[0] !== Dispatcher::FOUND) {
64
            return null;
65
        }
66
67 1
        $handler = $this->resolveHandler($routeInfo[1]);
68 1
        $parameters = $routeInfo[2];
69
70 1
        return call_user_func_array(
71 1
            $handler,
72 1
            array_merge($parameters, [$request])
73
        );
74
    }
75
76 1
    protected function resolveHandler(array $callback): array
77
    {
78 1
        $className = $callback[0];
79
80
        try {
81 1
            $handler = App::get($className);
82 1
        } catch (ServiceNotFoundException $e) {
83 1
            $handler = new $className();
84
        }
85
86 1
        $callback[0] = $handler;
87
88 1
        return $callback;
89
    }
90
}
91