ResponseTimeLogger::createFrom()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 9
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 3
nc 2
nop 2
dl 0
loc 9
rs 10
c 0
b 0
f 0
1
<?php
2
/**
3
 * @codingStandardsIgnoreStart
4
 *
5
 * @author       Barney Hanlon <[email protected]>
6
 * @copyright    Barney Hanlon 2017
7
 * @license      https://opensource.org/licenses/MIT
8
 *
9
 * @codingStandardsIgnoreEnd
10
 */
11
12
namespace Shrikeh\GuzzleMiddleware\TimerLogger\ResponseTimeLogger;
13
14
use Exception;
15
use Psr\Http\Message\RequestInterface;
16
use Psr\Http\Message\ResponseInterface;
17
use Psr\Log\LoggerInterface;
18
use Shrikeh\GuzzleMiddleware\TimerLogger\Formatter\FormatterInterface;
19
use Shrikeh\GuzzleMiddleware\TimerLogger\Formatter\Verbose;
20
use Shrikeh\GuzzleMiddleware\TimerLogger\RequestTimers\RequestTimers;
21
use Shrikeh\GuzzleMiddleware\TimerLogger\RequestTimers\RequestTimersInterface;
22
use Shrikeh\GuzzleMiddleware\TimerLogger\ResponseLogger\ResponseLogger;
23
use Shrikeh\GuzzleMiddleware\TimerLogger\ResponseLogger\ResponseLoggerInterface;
24
use Shrikeh\GuzzleMiddleware\TimerLogger\ResponseTimeLogger\Exception\ResponseLoggerException;
25
use Shrikeh\GuzzleMiddleware\TimerLogger\ResponseTimeLogger\Exception\TimersException;
26
use Shrikeh\GuzzleMiddleware\TimerLogger\Timer\TimerInterface;
27
28
/**
29
 * Class ResponseTimeLogger.
30
 */
31
final class ResponseTimeLogger implements ResponseTimeLoggerInterface
32
{
33
    /**
34
     * @var RequestTimersInterface
35
     */
36
    private $timers;
37
38
    /**
39
     * @var \Shrikeh\GuzzleMiddleware\TimerLogger\ResponseLogger\ResponseLoggerInterface
40
     */
41
    private $logger;
42
43
    /**
44
     * @param \Psr\Log\LoggerInterface $logger    A logger to log to
45
     * @param FormatterInterface       $formatter An optional formatter
46
     *
47
     * @return ResponseTimeLogger
48
     */
49
    public static function quickStart(
50
        LoggerInterface $logger,
51
        FormatterInterface $formatter = null
52
    ) {
53
        if (!$formatter) {
54
            $formatter = Verbose::quickStart();
55
        }
56
57
        return self::createFrom(new ResponseLogger($logger, $formatter));
58
    }
59
60
    /**
61
     * @param ResponseLoggerInterface     $logger a logger to log to
62
     * @param RequestTimersInterface|null $timers An optional timers collection
63
     *
64
     * @return ResponseTimeLogger
65
     */
66
    public static function createFrom(
67
        ResponseLoggerInterface $logger,
68
        RequestTimersInterface $timers = null
69
    ) {
70
        if (!$timers) {
71
            $timers = new RequestTimers();
72
        }
73
74
        return new self($timers, $logger);
75
    }
76
77
    /**
78
     * @param RequestTimersInterface  $timers A timers collection
79
     * @param ResponseLoggerInterface $logger a logger to log to
80
     */
81
    public function __construct(
82
        RequestTimersInterface $timers,
83
        ResponseLoggerInterface $logger
84
    ) {
85
        $this->timers = $timers;
86
        $this->logger = $logger;
87
    }
88
89
    /**
90
     * {@inheritdoc}
91
     */
92
    public function start(RequestInterface $request)
93
    {
94
        try {
95
            $this->logger->logStart(
96
                $this->startTimer($request),
97
                $request
98
            );
99
        } catch (TimersException $e) {
100
            throw $e;
101
        } catch (\Exception $e) {
102
            throw ResponseLoggerException::duringStart($e);
103
        }
104
    }
105
106
    /**
107
     * {@inheritdoc}
108
     */
109
    public function stop(RequestInterface $request, ResponseInterface $response)
110
    {
111
        $this->logger->logStop(
112
            $this->stopTimer($request),
113
            $request,
114
            $response
115
        );
116
    }
117
118
    /**
119
     * @param \Psr\Http\Message\RequestInterface $request The Request
120
     *
121
     * @return TimerInterface
122
     *
123
     * @throws TimersException if there is a problem starting the timer
124
     */
125
    private function startTimer(RequestInterface $request)
126
    {
127
        try {
128
            return $this->timers->start($request);
129
        } catch (Exception $e) {
130
            throw TimersException::start($e);
131
        }
132
    }
133
134
    /**
135
     * @param \Psr\Http\Message\RequestInterface $request The Request
136
     *
137
     * @return TimerInterface
138
     *
139
     * @throws TimersException if there is a problem stopping the timer
140
     */
141
    private function stopTimer(RequestInterface $request)
142
    {
143
        try {
144
            return $this->timers->stop($request);
145
        } catch (Exception $e) {
146
            throw TimersException::stop($e);
147
        }
148
    }
149
}
150