Completed
Push — master ( 12d5a5...116416 )
by Nil
02:22
created

QueryBus::__construct()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %
Metric Value
dl 0
loc 8
rs 9.4285
cc 2
eloc 4
nc 2
nop 1
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