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