Completed
Push — master ( bd4c23...b341c0 )
by Filipe
10:29
created

RouterMiddleware::handleFailedRoute()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 23
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 23
rs 9.0856
c 0
b 0
f 0
cc 3
eloc 17
nc 3
nop 2
1
<?php
2
3
/**
4
 * This file is part of slick/mvc package
5
 *
6
 * For the full copyright and license information, please view the LICENSE
7
 * file that was distributed with this source code.
8
 */
9
10
namespace Slick\Mvc\Http;
11
12
use Aura\Router\Route;
13
use Aura\Router\RouterContainer;
14
use Psr\Http\Message\ResponseInterface;
15
use Psr\Http\Message\ServerRequestInterface;
16
use Slick\Http\Server\AbstractMiddleware;
17
use Slick\Http\Server\MiddlewareInterface;
18
19
/**
20
 * Router Middleware
21
 *
22
 * @package Slick\Mvc\Http
23
 * @author  Filipe Silva <[email protected]>
24
 */
25
final class RouterMiddleware extends AbstractMiddleware implements
26
    MiddlewareInterface
27
{
28
    /**
29
     * @var RouterContainer
30
     */
31
    private $routerContainer;
32
33
    /**
34
     * Creates Router Middleware
35
     *
36
     * @param RouterContainer $routerContainer
37
     */
38
    public function __construct(RouterContainer $routerContainer)
39
    {
40
        $this->routerContainer = $routerContainer;
41
    }
42
43
    /**
44
     * Handles a Request and updated the response
45
     *
46
     * @param ServerRequestInterface $request
47
     * @param ResponseInterface $response
48
     *
49
     * @return ResponseInterface
50
     */
51
    public function handle(
52
        ServerRequestInterface $request, ResponseInterface $response
53
    )
54
    {
55
        $matcher = $this->routerContainer
56
            ->getMatcher();
57
58
        $route = $matcher->match($request);
59
60
        if (!$route) {
61
            return $this->handleFailedRoute(
62
                $matcher->getFailedRoute(),
63
                $response
64
            );
65
        }
66
67
        $request = $request->withAttribute('route', $route);
68
        return $this->executeNext($request, $response);
69
    }
70
71
    /**
72
     * Sets the response for failed route
73
     *
74
     * @param Route             $failedRoute
75
     * @param ResponseInterface $response
76
     *
77
     * @return ResponseInterface
78
     */
79
    private function handleFailedRoute(
80
        Route $failedRoute,
81
        ResponseInterface $response
82
    ) {
83
        switch ($failedRoute->failedRule) {
84
            case 'Aura\Router\Rule\Allows':
85
                $response = $response
86
                    ->withStatus(405)
87
                    ->withHeader('allow', $failedRoute->allows);
88
                break;
89
90
            case 'Aura\Router\Rule\Accepts':
91
                $response = $response
92
                    ->withStatus(406);
93
                break;
94
95
            default:
96
                $response = $response
97
                    ->withStatus(404);
98
        }
99
100
        return $response;
101
    }
102
}