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

MiddlewareDispatcher::hasMiddlewares()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 1
c 1
b 0
f 0
dl 0
loc 3
ccs 2
cts 2
cp 1
rs 10
cc 1
nc 1
nop 0
crap 1
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