Completed
Push — develop ( cc8c81...372a4c )
by Barney
14s
created

ResponseTimeLogger::startTimer()   A

Complexity

Conditions 2
Paths 1

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

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