CommandHandlerMiddleware::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 9
ccs 5
cts 5
cp 1
rs 9.9666
c 0
b 0
f 0
cc 1
nc 1
nop 3
crap 1
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