Completed
Push — master ( 00ed35...63fbb3 )
by Oscar
10:20
created

AuraRouter::router()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %
Metric Value
dl 0
loc 6
rs 9.4286
cc 1
eloc 3
nc 1
nop 1
1
<?php
2
3
namespace Psr7Middlewares\Middleware;
4
5
use Psr7Middlewares\Utils;
6
use Psr7Middlewares\Middleware;
7
use Aura\Router\RouterContainer;
8
use Aura\Router\Route;
9
use Psr\Http\Message\ServerRequestInterface;
10
use Psr\Http\Message\ResponseInterface;
11
12
class AuraRouter
13
{
14
    use Utils\CallableTrait;
15
16
    const KEY = 'AURA_ROUTE';
17
18
    /**
19
     * @var RouterContainer The router container
20
     */
21
    private $router;
22
23
    /**
24
     * Returns the route instance.
25
     *
26
     * @param ServerRequestInterface $request
27
     *
28
     * @return Route|null
29
     */
30
    public static function getRoute(ServerRequestInterface $request)
31
    {
32
        return Middleware::getAttribute($request, self::KEY);
33
    }
34
35
    /**
36
     * Set the RouterContainer instance.
37
     *
38
     * @param RouterContainer $router
39
     */
40
    public function __construct(RouterContainer $router)
41
    {
42
        $this->router = $router;
43
    }
44
45
    /**
46
     * Execute the middleware.
47
     *
48
     * @param ServerRequestInterface $request
49
     * @param ResponseInterface      $response
50
     * @param callable               $next
51
     *
52
     * @return ResponseInterface
53
     */
54
    public function __invoke(ServerRequestInterface $request, ResponseInterface $response, callable $next)
55
    {
56
        $matcher = $this->router->getMatcher();
57
        $route = $matcher->match($request);
58
59
        if (!$route) {
60
            $failedRoute = $matcher->getFailedRoute();
61
62
            switch ($failedRoute->failedRule) {
63
                case 'Aura\Router\Rule\Allows':
64
                    return $response->withStatus(405); // 405 METHOD NOT ALLOWED
65
66
                case 'Aura\Router\Rule\Accepts':
67
                    return $response->withStatus(406); // 406 NOT ACCEPTABLE
68
69
                default:
70
                    return $response->withStatus(404); // 404 NOT FOUND
71
            }
72
        }
73
74
        $request = Middleware::setAttribute($request, self::KEY, $route);
75
76
        foreach ($route->attributes as $name => $value) {
77
            $request = $request->withAttribute($name, $value);
78
        }
79
80
        $response = $this->executeCallable($route->handler, $request, $response);
81
82
        return $next($request, $response);
83
    }
84
}
85