Passed
Pull Request — master (#22)
by Evgeniy
07:40
created

MiddlewareDispatcher   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 66
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 2
Bugs 1 Features 0
Metric Value
wmc 5
eloc 14
c 2
b 1
f 0
dl 0
loc 66
ccs 15
cts 15
cp 1
rs 10

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A dispatch() 0 3 1
A add() 0 4 1
A buildMiddlewares() 0 10 2
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Yiisoft\Middleware\Dispatcher;
6
7
use Psr\Http\Message\ResponseInterface;
8
use Psr\Http\Message\ServerRequestInterface;
9
use Psr\Http\Server\MiddlewareInterface;
10
use Psr\Http\Server\RequestHandlerInterface;
11
12
final class MiddlewareDispatcher
13
{
14
    /**
15
     * Contains a middleware pipeline handler.
16
     *
17
     * @var MiddlewarePipelineInterface The middleware pipeline.
18
     */
19
    private MiddlewarePipelineInterface $pipeline;
20
21
    private MiddlewareFactoryInterface $middlewareFactory;
22
23
    /**
24
     * @var array[]|callable[]|string[]
25
     */
26
    private array $middlewareDefinitions = [];
27
28 7
    public function __construct(MiddlewareFactoryInterface $middlewareFactory, MiddlewarePipelineInterface $pipeline)
29
    {
30 7
        $this->middlewareFactory = $middlewareFactory;
31 7
        $this->pipeline = $pipeline;
32 7
    }
33
34
    /**
35
     * Builds and handles a new middleware pipeline. All added middleware definitions are cleared.
36
     *
37
     * @param ServerRequestInterface $request
38
     * @param RequestHandlerInterface $fallbackHandler
39
     *
40
     * @return ResponseInterface
41
     */
42 7
    public function dispatch(ServerRequestInterface $request, RequestHandlerInterface $fallbackHandler): ResponseInterface
43
    {
44 7
        return $this->pipeline->build($this->buildMiddlewares(), $fallbackHandler)->handle($request);
45
    }
46
47
    /**
48
     * @param array|callable|string $middlewareDefinition Name of PSR-15 middleware,
49
     * a callable with `function(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface`
50
     * signature or a handler action (an array of [handlerClass, handlerMethod]). For handler action and callable
51
     * typed parameters are automatically injected using dependency injection container passed to the route.
52
     * Current request and handler could be obtained by type-hinting for {@see ServerRequestInterface}
53
     * and {@see RequestHandlerInterface}.
54
     *
55
     * @return self
56
     */
57 7
    public function add($middlewareDefinition): self
58
    {
59 7
        $this->middlewareDefinitions[] = $middlewareDefinition;
60 7
        return $this;
61
    }
62
63
    /**
64
     * Creates middleware instances and clears middleware definitions.
65
     *
66
     * @return MiddlewareInterface[]
67
     */
68 7
    private function buildMiddlewares(): array
69
    {
70 7
        $middlewares = [];
71
72 7
        foreach ($this->middlewareDefinitions as $middlewareDefinition) {
73 7
            $middlewares[] = $this->middlewareFactory->create($middlewareDefinition);
74
        }
75
76 7
        $this->middlewareDefinitions = [];
77 7
        return $middlewares;
78
    }
79
}
80