CommandHandlerMiddleware   A
last analyzed

Complexity

Total Complexity 3

Size/Duplication

Total Lines 60
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 4

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 3
lcom 1
cbo 4
dl 0
loc 60
ccs 14
cts 14
cp 1
rs 10
c 0
b 0
f 0

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 9 1
A execute() 0 17 2
1
<?php
2
3
namespace League\Tactician\Handler;
4
5
use League\Tactician\Middleware;
6
use League\Tactician\Exception\CanNotInvokeHandlerException;
7
use League\Tactician\Handler\CommandNameExtractor\CommandNameExtractor;
8
use League\Tactician\Handler\Locator\HandlerLocator;
9
use League\Tactician\Handler\MethodNameInflector\MethodNameInflector;
10
11
/**
12
 * The "core" CommandBus. Locates the appropriate handler and executes command.
13
 */
14
class CommandHandlerMiddleware implements Middleware
15
{
16
    /**
17
     * @var CommandNameExtractor
18
     */
19
    private $commandNameExtractor;
20
21
    /**
22
     * @var HandlerLocator
23
     */
24
    private $handlerLocator;
25
26
    /**
27
     * @var MethodNameInflector
28
     */
29
    private $methodNameInflector;
30
31
    /**
32
     * @param CommandNameExtractor $commandNameExtractor
33
     * @param HandlerLocator       $handlerLocator
34
     * @param MethodNameInflector  $methodNameInflector
35
     */
36 6
    public function __construct(
37
        CommandNameExtractor $commandNameExtractor,
38
        HandlerLocator $handlerLocator,
39
        MethodNameInflector $methodNameInflector
40
    ) {
41 6
        $this->commandNameExtractor = $commandNameExtractor;
42 6
        $this->handlerLocator = $handlerLocator;
43 6
        $this->methodNameInflector = $methodNameInflector;
44 6
    }
45
46
    /**
47
     * Executes a command and optionally returns a value
48
     *
49
     * @param object   $command
50
     * @param callable $next
51
     *
52
     * @return mixed
53
     *
54
     * @throws CanNotInvokeHandlerException
55
     */
56 5
    public function execute($command, callable $next)
57
    {
58 5
        $commandName = $this->commandNameExtractor->extract($command);
59 5
        $handler = $this->handlerLocator->getHandlerForCommand($commandName);
60 5
        $methodName = $this->methodNameInflector->inflect($command, $handler);
61
62
        // is_callable is used here instead of method_exists, as method_exists
63
        // will fail when given a handler that relies on __call.
64 5
        if (!is_callable([$handler, $methodName])) {
65 1
            throw CanNotInvokeHandlerException::forCommand(
66 1
                $command,
67 1
                "Method '{$methodName}' does not exist on handler"
68
            );
69
        }
70
71 4
        return $handler->{$methodName}($command);
72
    }
73
}
74