Router   A
last analyzed

Complexity

Total Complexity 8

Size/Duplication

Total Lines 69
Duplicated Lines 0 %

Importance

Changes 2
Bugs 0 Features 1
Metric Value
eloc 37
c 2
b 0
f 1
dl 0
loc 69
rs 10
wmc 8

6 Methods

Rating   Name   Duplication   Size   Complexity  
A getGroups() 0 3 1
A apiResource() 0 16 1
A getRoutes() 0 3 1
A handle() 0 3 1
A adminResource() 0 23 1
A removeRoute() 0 5 3
1
<?php
2
3
namespace Bone\Router;
4
5
use Bone\Contracts\Container\ContainerInterface;
6
use Bone\Http\Middleware\JsonParse;
7
use Bone\Http\RouterInterface;
8
use Laminas\Diactoros\ResponseFactory;
9
use League\Route\Route;
10
use League\Route\RouteGroup;
11
use League\Route\Router as LeagueRouter;
12
use League\Route\Strategy\JsonStrategy;
13
use Psr\Http\Message\ResponseInterface;
14
use Psr\Http\Message\ServerRequestInterface;
15
use Psr\Http\Server\RequestHandlerInterface;
16
17
class Router extends LeagueRouter implements RequestHandlerInterface, RouterInterface
18
{
19
    /** @return Route[] */
20
    public function getRoutes(): array
21
    {
22
        return $this->routes;
23
    }
24
25
    /** @return RouteGroup[] */
26
    public function getGroups(): array
27
    {
28
        return $this->groups;
29
    }
30
31
    public function apiResource(string $urlSlug, string $controllerClass, ContainerInterface $c): RouteGroup
32
    {
33
        $factory = new ResponseFactory();
34
        $strategy = new JsonStrategy($factory);
35
        $strategy->setContainer($c);
36
        $group = $this->group('/api', function (RouteGroup $route) use ($controllerClass, $urlSlug) {
37
            $route->map('GET', '/' . $urlSlug, [$controllerClass, 'index']);
38
            $route->map('POST', '/' . $urlSlug, [$controllerClass, 'create']);
39
            $route->map('GET', '/' . $urlSlug . '/{id}', [$controllerClass, 'read']);
40
            $route->map('PATCH', '/' . $urlSlug . '/{id}', [$controllerClass, 'update']);
41
            $route->map('DELETE', '/' . $urlSlug . '/{id}', [$controllerClass, 'delete']);
42
        });
43
        $group->setStrategy($strategy);
44
        $group->middlewares([new JsonParse()]);
45
46
        return $group;
47
    }
48
49
    public function adminResource(string $urlSlug, string $controllerClass, ContainerInterface $c): RouteGroup
50
    {
51
        $factory = new ResponseFactory();
52
        $strategy = new JsonStrategy($factory);
53
        $strategy->setContainer($c);
54
        $group = $this->group('/admin', function (RouteGroup $route) use ($controllerClass, $urlSlug) {
55
            $route->map('GET', '/' . $urlSlug, [$controllerClass, 'index']);
56
            $route->map('POST', '/' . $urlSlug, [$controllerClass, 'create']);
57
            $route->map('GET', '/' . $urlSlug . '/{id}', [$controllerClass, 'read']);
58
            $route->map('PATCH', '/' . $urlSlug . '/{id}', [$controllerClass, 'update']);
59
            $route->map('DELETE', '/' . $urlSlug . '/{id}', [$controllerClass, 'delete']);
60
61
            $route->map('GET', '/' . $urlSlug, [$controllerClass, 'index']);
62
            $route->map('GET', '/' . $urlSlug . '/create', [$controllerClass, 'create']);
63
            $route->map('GET', '/' . $urlSlug . '/{id}', [$controllerClass, 'view']);
64
            $route->map('GET', '/' . $urlSlug . '/{id}/delete', [$controllerClass, 'delete']);
65
            $route->map('GET', '/' . $urlSlug . '/{id}/edit', [$controllerClass, 'edit']);
66
            $route->map('POST', '/' . $urlSlug . '/create', [$controllerClass, 'create']);
67
            $route->map('POST', '/' . $urlSlug . '/{id}/delete', [$controllerClass, 'delete']);
68
            $route->map('POST', '/' . $urlSlug . '/{id}/edit', [$controllerClass, 'edit']);
69
        });
70
71
        return $group;
72
    }
73
74
    public function removeRoute(Route $routeToRemove): void
75
    {
76
        foreach ($this->routes as $index => $route) {
77
            if ($route === $routeToRemove) {
78
                unset($this->routes[$index]);
79
            }
80
        }
81
    }
82
83
    public function handle(ServerRequestInterface $request): ResponseInterface
84
    {
85
        return $this->dispatch($request);
86
    }
87
}
88