Passed
Push — master ( e68a7a...f2323f )
by Hong
01:55
created

Router::getParams()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 2
nc 1
nop 1
dl 0
loc 4
rs 10
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * Phoole (PHP7.2+)
5
 *
6
 * @category  Library
7
 * @package   Phoole\Route
8
 * @copyright Copyright (c) 2019 Hong Zhang
9
 */
10
declare(strict_types=1);
11
12
namespace Phoole\Route;
13
14
use Phoole\Route\Util\Result;
15
use Phoole\Route\Util\RouteGroup;
16
use Phoole\Route\Util\RouteAwareTrait;
17
use Phoole\Route\Parser\ParserInterface;
18
use Phoole\Route\Parser\FastRouteParser;
19
use Phoole\Route\Resolver\DefaultResolver;
20
use Phoole\Route\Resolver\ResolverInterface;
21
use Psr\Http\Message\ResponseInterface;
22
use Psr\Http\Server\MiddlewareInterface;
23
use Psr\Http\Server\RequestHandlerInterface;
24
use Psr\Http\Message\ServerRequestInterface;
25
26
/**
27
 * Router
28
 *
29
 * @package Phoole\Route
30
 */
31
class Router implements MiddlewareInterface
32
{
33
    use RouteAwareTrait;
34
35
    const URI_PARAMETERS = '_parsedParams';
36
    
37
    /**
38
     * @var ResolverInterface
39
     */
40
    protected $resolver;
41
42
    /**
43
     * Load route definitions and set the parser
44
     *
45
     * @param  array $routes route definitions
46
     * @param  ResolverInterface $resolver
47
     * @param  ParserInterface $parser
48
     *
49
     */
50
    public function __construct(
51
        array $routes = [],
52
        ResolverInterface $resolver = null,
53
        ParserInterface $parser = null
54
    ) {
55
        $this
56
            ->loadRoutes($routes)
57
            ->setResolver($resolver ?? new DefaultResolver())
58
            ->setParser($parser ?? new FastRouteParser());
59
    }
60
61
    /**
62
     * Match http request with predefined routes, returns a Result object
63
     *
64
     * @param  ServerRequestInterface $request
65
     * @return Result
66
     */
67
    public function match(ServerRequestInterface $request): Result
68
    {
69
        $result = new Result($request);
70
        return $this->groupMatch($result);
71
    }
72
73
    /**
74
     * {@inheritDoc}
75
     */
76
    public function process(
77
        ServerRequestInterface $request,
78
        RequestHandlerInterface $handler
79
    ): ResponseInterface {
80
        $result = $this->match($request);
81
        if ($result->isMatched()) {
82
            return $this->handleResult($result);
83
        } else {
84
            return $handler->handle($request);
85
        }
86
    }
87
88
    /**
89
     * Utility function for getting parameter values stored in the request
90
     *
91
     * @param  ServerRequestInterface $request
92
     * @return array
93
     */
94
    public static function getParams(ServerRequestInterface $request): array
95
    {
96
        $params = $request->getAttribute(Router::URI_PARAMETERS) ?? [];
97
        return $params;
98
    }
99
100
    /**
101
     * @param  ResolverInterface $resolver
102
     * @return Router $this
103
     */
104
    protected function setResolver(ResolverInterface $resolver): Router
105
    {
106
        $this->resolver = $resolver;
107
        return $this;
108
    }
109
110
    /**
111
     * @param  Result $result
112
     * @return ResponseInterface
113
     * @throws \InvalidArgumentException    if resolver failure
114
     */
115
    protected function handleResult(Result $result): ResponseInterface
116
    {
117
        $request = $result->getRequest();
118
        $handler = $result->getHandler();
119
120
        if (is_callable($handler)) {
121
            return $handler($request);
122
        } elseif ($handler instanceof RequestHandlerInterface) {
123
            return $handler->handle($request);
124
        } else {
125
            $handler = $this->resolver->resolve($handler);
126
            return $handler($request);
127
        }
128
    }
129
}
130