Passed
Push — master ( a33c53...5c26a9 )
by Michael
02:16
created

SymfonyEventDispatcherDecorator   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 111
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 6

Test Coverage

Coverage 92.59%

Importance

Changes 0
Metric Value
wmc 7
lcom 1
cbo 6
dl 0
loc 111
ccs 25
cts 27
cp 0.9259
rs 10
c 0
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 15 1
B request() 0 24 4
A dispatchOnRequest() 0 7 1
A dispatchOnResponse() 0 7 1
1
<?php
2
declare(strict_types = 1);
3
4
namespace Mikemirten\Component\JsonApi\HttpClient\Decorator;
5
6
use Mikemirten\Component\JsonApi\HttpClient\Decorator\SymfonyEvent\ExceptionEvent;
7
use Mikemirten\Component\JsonApi\HttpClient\Decorator\SymfonyEvent\RequestEvent;
8
use Mikemirten\Component\JsonApi\HttpClient\Decorator\SymfonyEvent\ResponseEvent;
9
use Mikemirten\Component\JsonApi\HttpClient\Exception\RequestException;
10
use Mikemirten\Component\JsonApi\HttpClient\HttpClientInterface;
11
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
12
use Psr\Http\Message\RequestInterface;
13
use Psr\Http\Message\ResponseInterface;
14
15
/**
16
 * Events handling decorator based on the Symfony EventDispatcher component.
17
 *
18
 * @package Mikemirten\Component\JsonApi\HttpClient\Decorator
19
 */
20
class SymfonyEventDispatcherDecorator implements HttpClientInterface
21
{
22
    /**
23
     * HTTP Client
24
     *
25
     * @var HttpClientInterface
26
     */
27
    protected $client;
28
29
    /**
30
     * @var EventDispatcherInterface
31
     */
32
    protected $dispatcher;
33
34
    /**
35
     * @var string
36
     */
37
    protected $requestEvent;
38
39
    /**
40
     * @var string
41
     */
42
    protected $responseEvent;
43
44
    /**
45
     * @var string
46
     */
47
    protected $exceptionEvent;
48
49
    /**
50
     * SymfonyEventDispatcherDecorator constructor.
51
     *
52
     * @param HttpClientInterface      $client
53
     * @param EventDispatcherInterface $dispatcher
54
     *
55
     * @param string $requestEvent
56
     * @param string $responseEvent
57
     * @param string $exceptionEvent
58
     */
59 2
    public function __construct(
60
        HttpClientInterface      $client,
61
        EventDispatcherInterface $dispatcher,
62
63
        string $requestEvent,
64
        string $responseEvent,
65
        string $exceptionEvent
66
    ) {
67 2
        $this->client     = $client;
68 2
        $this->dispatcher = $dispatcher;
69
70 2
        $this->requestEvent   = $requestEvent;
71 2
        $this->responseEvent  = $responseEvent;
72 2
        $this->exceptionEvent = $exceptionEvent;
73 2
    }
74
75
    /**
76
     * {@inheritdoc}
77
     */
78 2
    public function request(RequestInterface $request): ResponseInterface
79
    {
80 2
        $request = $this->dispatchOnRequest($request);
81
82
        try {
83 2
            $response = $this->client->request($request);
84
        }
85 1
        catch (\Throwable $exception) {
86 1
            $exceptionEvent = new ExceptionEvent($request, $exception);
87 1
            $this->dispatcher->dispatch($this->exceptionEvent, $exceptionEvent);
88
89 1
            if (! $exceptionEvent->hasResponse()) {
90
                throw new RequestException($request, $exception);
0 ignored issues
show
Compatibility introduced by
$exception of type object<Throwable> is not a sub-type of object<Exception>. It seems like you assume a concrete implementation of the interface Throwable to be always present.

This check looks for parameters that are defined as one type in their type hint or doc comment but seem to be used as a narrower type, i.e an implementation of an interface or a subclass.

Consider changing the type of the parameter or doing an instanceof check before assuming your parameter is of the expected type.

Loading history...
91
            }
92
93 1
            $response = $exceptionEvent->getResponse();
94
95 1
            if (! $exceptionEvent->isResponseEventEnabled()) {
96
                return $response;
97
            }
98
        }
99
100 2
        return $this->dispatchOnResponse($response);
101
    }
102
103
    /**
104
     * Dispatch on-request event
105
     *
106
     * @param  RequestInterface $request
107
     * @return RequestInterface
108
     */
109 2
    protected function dispatchOnRequest(RequestInterface $request): RequestInterface
110
    {
111 2
        $requestEvent = new RequestEvent($request);
112 2
        $this->dispatcher->dispatch($this->requestEvent, $requestEvent);
113
114 2
        return $requestEvent->getRequest();
115
    }
116
117
    /**
118
     * Dispatch on-response event
119
     *
120
     * @param  ResponseInterface $response
121
     * @return ResponseInterface
122
     */
123 2
    protected function dispatchOnResponse(ResponseInterface $response): ResponseInterface
124
    {
125 2
        $responseEvent = new ResponseEvent($response);
126 2
        $this->dispatcher->dispatch($this->responseEvent, $responseEvent);
127
128 2
        return $responseEvent->getResponse();
129
    }
130
}