Passed
Push — master ( 0f979d...0862ec )
by Hong
02:33 queued 13s
created

Router::setResolver()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 2
c 1
b 0
f 0
nc 1
nop 1
dl 0
loc 4
rs 10
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
     * @param  ResolverInterface $resolver
90
     * @return Router $this
91
     */
92
    protected function setResolver(ResolverInterface $resolver): Router
93
    {
94
        $this->resolver = $resolver;
95
        return $this;
96
    }
97
98
    /**
99
     * @param  Result $result
100
     * @return ResponseInterface
101
     * @throws \InvalidArgumentException    if resolver failure
102
     */
103
    protected function handleResult(Result $result): ResponseInterface
104
    {
105
        $request = $result->getRequest();
106
        $handler = $result->getHandler();
107
108
        if (is_callable($handler)) {
109
            return $handler($request);
110
        } elseif ($handler instanceof RequestHandlerInterface) {
111
            return $handler->handle($request);
112
        } else {
113
            $handler = $this->resolver->resolve($handler);
114
            return $handler($request);
115
        }
116
    }
117
}
118