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

QueryBus   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 46
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 3
Metric Value
wmc 7
lcom 0
cbo 3
dl 0
loc 46
rs 10

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 8 2
B __invoke() 0 20 5
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