Skip to content

Commit 2788893

Browse files
author
Witold Wasiczko
committed
Refactor to use formatter
1 parent e1d0f75 commit 2788893

14 files changed

+255
-193
lines changed

.gitignore

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
/vendor/
2-
composer.lock
2+
composer.lock

README.md

+16-9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# log-http-messages middleware [![Build Status](https://travis-ci.org/php-middleware/log-http-messages.svg)](https://travis-ci.org/php-middleware/log-http-messages)
2-
Request and response middleware logger with PSR-7 and PSR-3
2+
Middleware for log PSR-7 HTTP messages using PSR-3 logger
33

44
This middleware provide framework-agnostic possibility to log request and response messages to PSR-3 logger.
55

@@ -8,25 +8,32 @@ This middleware provide framework-agnostic possibility to log request and respon
88
```json
99
{
1010
"require": {
11-
"php-middleware/log-http-messages": "^1.0.0"
11+
"php-middleware/log-http-messages": "^2.0.0"
1212
}
1313
}
1414
```
1515

16-
To log any request you need pass into `LogRequestMiddleware` instance `Psr\Log\LoggerInterface` and add middleware to your middleware runner. To log response use `LogResponseMiddleware`.
16+
To log http messages you need pass into `LogRequestMiddleware` implementation of `PhpMiddleware\LogHttpMessages\Formatter\HttpMessagesFormatter`,
17+
instance `Psr\Log\LoggerInterface` and add middleware to your middleware runner.
18+
Third parameter is log level and it's optional (`Psr\Log\LogLevel::INFO` as default).
19+
20+
There are tree implementation of `PhpMiddleware\LogHttpMessages\Formatter\HttpMessagesFormatter`:
21+
22+
* `PhpMiddleware\LogHttpMessages\Formatter\RequestFormatter` to log request message,
23+
* `PhpMiddleware\LogHttpMessages\Formatter\ResponseFormatter` to log response message,
24+
* `PhpMiddleware\LogHttpMessages\Formatter\BothFormatter` to log request and response message.
1725

1826
```php
19-
$logRequestMiddleware = new PhpMiddleware\LogHttpMessages\LogRequestMiddleware($logger);
20-
$logResponseMiddleware = new PhpMiddleware\LogHttpMessages\LogResponseMiddleware($logger);
27+
$requestFormatter = PhpMiddleware\LogHttpMessages\Formatter\RequestFormatter();
28+
$responseFormatter = PhpMiddleware\LogHttpMessages\Formatter\ResponseFormatter();
29+
$formatter = new PhpMiddleware\LogHttpMessages\Formatter\BothFormatter(requestFormatter, responseFormatter);
30+
$logMiddleware = new PhpMiddleware\LogHttpMessages\LogMiddleware(formatter, $logger);
2131

2232
$app = new MiddlewareRunner();
23-
$app->add($logRequestMiddleware);
24-
$app->add($logResponseMiddleware);
33+
$app->add($logMiddleware);
2534
$app->run($request, $response);
2635
```
2736

28-
Middlewares have optional second parameter in constructor with log level (default `Psr\Log\LogLevel::INFO`).
29-
3037
## It's just works with any modern php framework and logger!
3138

3239
Middleware tested on:

src/AbstractLogMiddleware.php

-57
This file was deleted.

src/Formatter/BothFormatter.php

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
namespace PhpMiddleware\LogHttpMessages\Formatter;
4+
5+
use Psr\Http\Message\ResponseInterface;
6+
use Psr\Http\Message\ServerRequestInterface;
7+
8+
final class BothFormatter implements HttpMessagesFormatter
9+
{
10+
private $requestFormatter;
11+
private $responseFormatter;
12+
13+
/**
14+
* @param RequestFormatter $requestFormatter
15+
* @param ResponseFormatter $responseFormatter
16+
*/
17+
public function __construct(RequestFormatter $requestFormatter, ResponseFormatter $responseFormatter)
18+
{
19+
$this->requestFormatter = $requestFormatter;
20+
$this->responseFormatter = $responseFormatter;
21+
}
22+
23+
/**
24+
* @param ServerRequestInterface $request
25+
* @param ResponseInterface $response
26+
*
27+
* @return string
28+
*/
29+
public function format(ServerRequestInterface $request, ResponseInterface $response)
30+
{
31+
$requestString = $this->requestFormatter->format($request, $response);
32+
$reponseString = $this->responseFormatter->format($request, $response);
33+
34+
return sprintf('Request: %s; Response %s', $requestString, $reponseString);
35+
}
36+
}
+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
namespace PhpMiddleware\LogHttpMessages\Formatter;
4+
5+
use Psr\Http\Message\ResponseInterface;
6+
use Psr\Http\Message\ServerRequestInterface;
7+
8+
interface HttpMessagesFormatter
9+
{
10+
/**
11+
* @param ServerRequestInterface $request
12+
* @param ResponseInterface $response
13+
*
14+
* @return string
15+
*/
16+
public function format(ServerRequestInterface $request, ResponseInterface $response);
17+
}

src/Formatter/RequestFormatter.php

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
namespace PhpMiddleware\LogHttpMessages\Formatter;
4+
5+
use Psr\Http\Message\ResponseInterface;
6+
use Psr\Http\Message\ServerRequestInterface;
7+
use Zend\Diactoros\Request\Serializer;
8+
9+
final class RequestFormatter implements HttpMessagesFormatter
10+
{
11+
public function format(ServerRequestInterface $request, ResponseInterface $response)
12+
{
13+
return Serializer::toString($request);
14+
}
15+
}

src/Formatter/ResponseFormatter.php

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
namespace PhpMiddleware\LogHttpMessages\Formatter;
4+
5+
use Psr\Http\Message\ResponseInterface;
6+
use Psr\Http\Message\ServerRequestInterface;
7+
use Zend\Diactoros\Response\Serializer;
8+
9+
final class ResponseFormatter implements HttpMessagesFormatter
10+
{
11+
public function format(ServerRequestInterface $request, ResponseInterface $response)
12+
{
13+
return Serializer::toString($response);
14+
}
15+
}

src/LogMiddleware.php

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
<?php
2+
3+
namespace PhpMiddleware\LogHttpMessages;
4+
5+
use PhpMiddleware\LogHttpMessages\Formatter\HttpMessagesFormatter;
6+
use Psr\Http\Message\ResponseInterface as Response;
7+
use Psr\Http\Message\ServerRequestInterface as ServerRequest;
8+
use Psr\Log\LoggerInterface as Logger;
9+
use Psr\Log\LogLevel;
10+
11+
class LogMiddleware
12+
{
13+
/**
14+
* @var Logger
15+
*/
16+
protected $logger;
17+
18+
/**
19+
* @var int
20+
*/
21+
protected $level;
22+
23+
/**
24+
* @var HttpMessagesFormatter
25+
*/
26+
protected $formatter;
27+
28+
/**
29+
* @param LoggerInterface $logger
30+
* @param int $level
31+
*/
32+
public function __construct(HttpMessagesFormatter $formatter, Logger $logger, $level = LogLevel::INFO)
33+
{
34+
$this->formatter = $formatter;
35+
$this->logger = $logger;
36+
$this->level = $level;
37+
}
38+
39+
/**
40+
* @param ServerRequest $request
41+
* @param Response $response
42+
* @param callable $next
43+
*
44+
* @return ResponseInterface
45+
*/
46+
public function __invoke(ServerRequest $request, Response $response, callable $next)
47+
{
48+
$outResponse = $next($request, $response);
49+
50+
$messages = $this->formatter->format($request, $response);
51+
52+
if (!is_string($messages)) {
53+
throw new \UnexpectedValueException(sprintf('%s must return string', HttpMessagesFormatter::class));
54+
}
55+
56+
$this->logger->log($this->level, $messages);
57+
58+
return $outResponse;
59+
}
60+
}

src/LogRequestMiddleware.php

-21
This file was deleted.

src/LogResponseMiddleware.php

-21
This file was deleted.

test/Formatter/BothFormatterTest.php

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
namespace PhpMiddlewareTest\LogHttpMessages\Formatter;
4+
5+
use PhpMiddleware\LogHttpMessages\Formatter\BothFormatter;
6+
use PhpMiddleware\LogHttpMessages\Formatter\RequestFormatter;
7+
use PhpMiddleware\LogHttpMessages\Formatter\ResponseFormatter;
8+
use PHPUnit_Framework_TestCase;
9+
use Zend\Diactoros\Response;
10+
use Zend\Diactoros\ServerRequest;
11+
12+
class BothFormatterTest extends PHPUnit_Framework_TestCase
13+
{
14+
protected $formatter;
15+
16+
protected function setUp()
17+
{
18+
$requestFormatter = new RequestFormatter();
19+
$responseFormatter = new ResponseFormatter();
20+
21+
$this->formatter = new BothFormatter($requestFormatter, $responseFormatter);
22+
}
23+
24+
public function testFormatter()
25+
{
26+
$request = new ServerRequest([], [], 'https://github.com/php-middleware/log-http-messages', 'GET', 'php://input', ['Accept' => 'text/html']);
27+
$response = new Response('php://memory', 500, ['Content-Type' => 'text/html']);
28+
29+
$result = $this->formatter->format($request, $response);
30+
31+
$this->assertSame("Request: GET /php-middleware/log-http-messages HTTP/1.1\r\nAccept: text/html; Response HTTP/1.1 500 Internal Server Error\r\nContent-Type: text/html", $result);
32+
}
33+
}

0 commit comments

Comments
 (0)