Test Failed
Push — master ( d89333...e2d202 )
by Alexey
03:26
created

Router::next()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 13
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 13
rs 9.4285
ccs 0
cts 8
cp 0
cc 1
eloc 6
nc 1
nop 1
crap 2
1
<?php declare(strict_types = 1);
2
3
namespace Venta\Routing;
4
5
use Psr\Http\Message\ResponseInterface;
6
use Psr\Http\Message\ServerRequestInterface;
7
use Venta\Contracts\Routing\ImmutableRouteCollection as RouteCollectionContract;
8
use Venta\Contracts\Routing\MiddlewarePipelineFactory as MiddlewarePipelineFactoryContract;
9
use Venta\Contracts\Routing\RequestRouteCollectionFactory;
10
use Venta\Contracts\Routing\RouteDispatcherFactory as RouteDispatcherFactoryContract;
11
use Venta\Contracts\Routing\RouteMatcher as RouteMatcherContract;
12
use Venta\Contracts\Routing\Router as RouterContract;
13
14
/**
15
 * Class Router
16
 *
17
 * @package Venta\Routing
18
 */
19
final class Router implements RouterContract
20
{
21
    /**
22
     * @var RouteDispatcherFactoryContract
23
     */
24
    private $dispatcherFactory;
25
26
    /**
27
     * @var RouteMatcherContract
28
     */
29
    private $matcher;
30
31
    /**
32
     * @var MiddlewarePipelineFactoryContract
33
     */
34
    private $pipelineFactory;
35
36
    /**
37
     * @var RequestRouteCollectionFactory
38
     */
39
    private $routeCollectionFactory;
40
41
    /**
42
     * @var RouteCollectionContract
43
     */
44
    private $routes;
45
46
    /**
47
     * Router constructor.
48
     *
49
     * @param RouteDispatcherFactoryContract $dispatcherFactory
50
     * @param RouteMatcherContract $matcher
51
     * @param MiddlewarePipelineFactoryContract $pipelineFactory
52
     * @param RouteCollectionContract $routes
53
     * @param RequestRouteCollectionFactory $routeCollectionFactory
54
     */
55
    public function __construct(
56
        RouteDispatcherFactoryContract $dispatcherFactory,
57
        RouteMatcherContract $matcher,
58
        MiddlewarePipelineFactoryContract $pipelineFactory,
59
        RouteCollectionContract $routes,
60
        RequestRouteCollectionFactory $routeCollectionFactory
61
    ) {
62
        $this->dispatcherFactory = $dispatcherFactory;
63
        $this->matcher = $matcher;
64
        $this->pipelineFactory = $pipelineFactory;
65
        $this->routes = $routes;
66
        $this->routeCollectionFactory = $routeCollectionFactory;
67
    }
68
69
    /**
70
     * @inheritDoc
71
     */
72
    public function next(ServerRequestInterface $request): ResponseInterface
73
    {
74
        $requestRouteCollection = $this->routeCollectionFactory->create($this->routes, $request);
75
        // Find matching route against provided request.
76
        $route = $this->matcher->match($request, $requestRouteCollection);
77
78
        // Create route middleware pipeline.
79
        $pipeline = $this->pipelineFactory->create($route->middlewares());
80
        // Create the last delegate, which calls route handler.
81
        $routeDispatcher = $this->dispatcherFactory->create($route);
82
83
        return $pipeline->process($request, $routeDispatcher);
84
    }
85
86
}