QueryBus::__invoke()   B
last analyzed

Complexity

Conditions 5
Paths 6

Size

Total Lines 20
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 20
rs 8.8571
c 0
b 0
f 0
cc 5
eloc 12
nc 6
nop 2
1
<?php
2
3
namespace NilPortugues\MessageBus\QueryBus;
4
5
use NilPortugues\Assert\Assert;
6
use NilPortugues\MessageBus\QueryBus\Contracts\Query;
7
use NilPortugues\MessageBus\QueryBus\Contracts\QueryBusMiddleware as QueryBusMiddlewareInterface;
8
use NilPortugues\MessageBus\QueryBus\Contracts\QueryResponse;
9
10
class QueryBus implements QueryBusMiddlewareInterface
11
{
12
    /** @var QueryBusMiddleware[] */
13
    protected $middleware;
14
15
    /**
16
     * StackedQueryBus constructor.
17
     *
18
     * @param array $middleware
19
     */
20
    public function __construct(array $middleware = [])
21
    {
22
        foreach ($middleware as $queryBusMiddleware) {
23
            Assert::isInstanceOf($queryBusMiddleware, QueryBusMiddlewareInterface::class);
24
        }
25
26
        $this->middleware = $middleware;
27
    }
28
29
    /**
30
     * @param Query         $query
31
     * @param callable|null $next
32
     *
33
     * @return QueryResponse
34
     */
35
    public function __invoke(Query $query, callable $next = null) : QueryResponse
36
    {
37
        $middleware = $this->middleware;
38
        $current = array_shift($middleware);
39
40
        if (!empty($middleware)) {
41
            foreach ($middleware as $queryBusMiddleware) {
42
                $callable = function ($query) use ($queryBusMiddleware) {
43
                    return $queryBusMiddleware->__invoke($query);
44
                };
45
46
                $response = $current->__invoke($query, $callable);
47
                $current = $queryBusMiddleware;
48
            }
49
        } elseif ($current) {
50
            $response = $current->__invoke($query);
51
        }
52
53
        return (!empty($response)) ? $response : EmptyResponse::create();
54
    }
55
}
56