ActionHandler::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 3
cts 3
cp 1
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 1
crap 1
1
<?php
2
3
namespace Equip\Handler;
4
5
use Equip\Action;
6
use Equip\Adr\DomainInterface;
7
use Equip\Adr\InputInterface;
8
use Equip\Adr\PayloadInterface;
9
use Equip\Adr\ResponderInterface;
10
use Equip\Resolver\ResolverTrait;
11
use Psr\Http\Message\ResponseInterface;
12
use Psr\Http\Message\ServerRequestInterface;
13
use Relay\ResolverInterface;
14
15
class ActionHandler
16
{
17
    use ResolverTrait;
18
19
    const ACTION_ATTRIBUTE = 'equip/adr:action';
20
21
    /**
22
     * @param ResolverInterface $resolver
23
     */
24 1
    public function __construct(ResolverInterface $resolver)
25
    {
26 1
        $this->resolver = $resolver;
27 1
    }
28
29
    /**
30
     * @param ServerRequestInterface $request
31
     * @param ResponseInterface $response
32
     * @param callable $next
33
     */
34 1
    public function __invoke(
35
        ServerRequestInterface $request,
36
        ResponseInterface $response,
37
        callable $next
38
    ) {
39 1
        $action = $request->getAttribute(self::ACTION_ATTRIBUTE);
40 1
        $request = $request->withoutAttribute(self::ACTION_ATTRIBUTE);
41
42 1
        $response = $this->handle($action, $request, $response);
43
44 1
        return $next($request, $response);
45
    }
46
47
    /**
48
     * Use the action collaborators to get a response.
49
     *
50
     * @param Action $action
51
     * @param ServerRequestInterface $request
52
     * @param ResponseInterface $response
53
     *
54
     * @return ResponseInterface
55
     */
56 1
    private function handle(
57
        Action $action,
58
        ServerRequestInterface $request,
59
        ResponseInterface $response
60
    ) {
61 1
        $domain = $this->resolve($action->getDomain());
62 1
        $input = $this->resolve($action->getInput());
63 1
        $responder = $this->resolve($action->getResponder());
64
65 1
        $payload = $this->payload($domain, $input, $request);
66 1
        $response = $this->response($responder, $request, $response, $payload);
67
68 1
        return $response;
69
    }
70
71
    /**
72
     * Execute the domain to get a payload using input from the request.
73
     *
74
     * @param DomainInterface $domain
75
     * @param InputInterface $input
76
     * @param ServerRequestInterface $request
77
     *
78
     * @return PayloadInterface
79
     */
80 1
    private function payload(
81
        DomainInterface $domain,
82
        InputInterface $input,
83
        ServerRequestInterface $request
84
    ) {
85 1
        return $domain($input($request));
86
    }
87
88
    /**
89
     * Execute the responder to marshall the payload into the response.
90
     *
91
     * @param ResponderInterface $responder
92
     * @param ServerRequestInterface $request
93
     * @param ResponseInterface $response
94
     * @param PayloadInterface $payload
95
     *
96
     * @return ResponseInterface
97
     */
98 1
    private function response(
99
        ResponderInterface $responder,
100
        ServerRequestInterface $request,
101
        ResponseInterface $response,
102
        PayloadInterface $payload
103
    ) {
104 1
        return $responder($request, $response, $payload);
105
    }
106
}
107