Skip to content

Commit 8245b0a

Browse files
authored
Merge pull request #2937 from elazar/feature/psr-log
Add support for PSR-3
2 parents b8c69e6 + 40eebcd commit 8245b0a

8 files changed

Lines changed: 135 additions & 39 deletions

File tree

Slim/App.php

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use Psr\Http\Message\ServerRequestInterface;
1717
use Psr\Http\Server\MiddlewareInterface;
1818
use Psr\Http\Server\RequestHandlerInterface;
19+
use Psr\Log\LoggerInterface;
1920
use Slim\Factory\ServerRequestCreatorFactory;
2021
use Slim\Interfaces\CallableResolverInterface;
2122
use Slim\Interfaces\MiddlewareDispatcherInterface;
@@ -140,23 +141,26 @@ public function addRoutingMiddleware(): RoutingMiddleware
140141
/**
141142
* Add the Slim built-in error middleware to the app middleware stack
142143
*
143-
* @param bool $displayErrorDetails
144-
* @param bool $logErrors
145-
* @param bool $logErrorDetails
144+
* @param bool $displayErrorDetails
145+
* @param bool $logErrors
146+
* @param bool $logErrorDetails
147+
* @param LoggerInterface|null $logger
146148
*
147149
* @return ErrorMiddleware
148150
*/
149151
public function addErrorMiddleware(
150152
bool $displayErrorDetails,
151153
bool $logErrors,
152-
bool $logErrorDetails
154+
bool $logErrorDetails,
155+
?LoggerInterface $logger = null
153156
): ErrorMiddleware {
154157
$errorMiddleware = new ErrorMiddleware(
155158
$this->getCallableResolver(),
156159
$this->getResponseFactory(),
157160
$displayErrorDetails,
158161
$logErrors,
159-
$logErrorDetails
162+
$logErrorDetails,
163+
$logger
160164
);
161165
$this->add($errorMiddleware);
162166
return $errorMiddleware;

Slim/Handlers/ErrorHandler.php

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use Psr\Http\Message\ResponseFactoryInterface;
1414
use Psr\Http\Message\ResponseInterface;
1515
use Psr\Http\Message\ServerRequestInterface;
16+
use Psr\Log\LoggerInterface;
1617
use RuntimeException;
1718
use Slim\Error\Renderers\HtmlErrorRenderer;
1819
use Slim\Error\Renderers\JsonErrorRenderer;
@@ -23,6 +24,7 @@
2324
use Slim\Interfaces\CallableResolverInterface;
2425
use Slim\Interfaces\ErrorHandlerInterface;
2526
use Slim\Interfaces\ErrorRendererInterface;
27+
use Slim\Logger;
2628
use Throwable;
2729

2830
use function array_intersect;
@@ -121,14 +123,24 @@ class ErrorHandler implements ErrorHandlerInterface
121123
*/
122124
protected $responseFactory;
123125

126+
/*
127+
* @var LoggerInterface
128+
*/
129+
protected $logger;
130+
124131
/**
125132
* @param CallableResolverInterface $callableResolver
126133
* @param ResponseFactoryInterface $responseFactory
134+
* @param LoggerInterface|null $logger
127135
*/
128-
public function __construct(CallableResolverInterface $callableResolver, ResponseFactoryInterface $responseFactory)
129-
{
136+
public function __construct(
137+
CallableResolverInterface $callableResolver,
138+
ResponseFactoryInterface $responseFactory,
139+
?LoggerInterface $logger = null
140+
) {
130141
$this->callableResolver = $callableResolver;
131142
$this->responseFactory = $responseFactory;
143+
$this->logger = $logger ?: $this->getDefaultLogger();
132144
}
133145

134146
/**
@@ -311,7 +323,17 @@ protected function writeToErrorLog(): void
311323
*/
312324
protected function logError(string $error): void
313325
{
314-
error_log($error);
326+
$this->logger->error($error);
327+
}
328+
329+
/**
330+
* Returns a default logger implementation.
331+
*
332+
* @return LoggerInterface
333+
*/
334+
protected function getDefaultLogger(): LoggerInterface
335+
{
336+
return new Logger();
315337
}
316338

317339
/**

Slim/Logger.php

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
/**
4+
* Slim Framework (https://slimframework.com)
5+
*
6+
* @license https://github.com/slimphp/Slim/blob/4.x/LICENSE.md (MIT License)
7+
*/
8+
9+
declare(strict_types=1);
10+
11+
namespace Slim;
12+
13+
use Psr\Log\AbstractLogger;
14+
use Psr\Log\InvalidArgumentException;
15+
16+
class Logger extends AbstractLogger
17+
{
18+
/**
19+
* @param mixed $level
20+
* @param string $message
21+
* @param array $context
22+
*
23+
* @return void
24+
*
25+
* @throws InvalidArgumentException
26+
*/
27+
public function log($level, $message, array $context = [])
28+
{
29+
error_log($message);
30+
}
31+
}

Slim/Middleware/ErrorMiddleware.php

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Psr\Http\Message\ServerRequestInterface;
1616
use Psr\Http\Server\MiddlewareInterface;
1717
use Psr\Http\Server\RequestHandlerInterface;
18+
use Psr\Log\LoggerInterface;
1819
use Slim\Exception\HttpException;
1920
use Slim\Handlers\ErrorHandler;
2021
use Slim\Interfaces\CallableResolverInterface;
@@ -51,6 +52,11 @@ class ErrorMiddleware implements MiddlewareInterface
5152
*/
5253
protected $logErrorDetails;
5354

55+
/**
56+
* @var LoggerInterface|null
57+
*/
58+
protected $logger;
59+
5460
/**
5561
* @var ErrorHandlerInterface[]|callable[]
5662
*/
@@ -72,19 +78,22 @@ class ErrorMiddleware implements MiddlewareInterface
7278
* @param bool $displayErrorDetails
7379
* @param bool $logErrors
7480
* @param bool $logErrorDetails
81+
* @param LoggerInterface|null $logger
7582
*/
7683
public function __construct(
7784
CallableResolverInterface $callableResolver,
7885
ResponseFactoryInterface $responseFactory,
7986
bool $displayErrorDetails,
8087
bool $logErrors,
81-
bool $logErrorDetails
88+
bool $logErrorDetails,
89+
?LoggerInterface $logger = null
8290
) {
8391
$this->callableResolver = $callableResolver;
8492
$this->responseFactory = $responseFactory;
8593
$this->displayErrorDetails = $displayErrorDetails;
8694
$this->logErrors = $logErrors;
8795
$this->logErrorDetails = $logErrorDetails;
96+
$this->logger = $logger;
8897
}
8998

9099
/**
@@ -150,7 +159,11 @@ public function getErrorHandler(string $type)
150159
public function getDefaultErrorHandler()
151160
{
152161
if ($this->defaultErrorHandler === null) {
153-
$this->defaultErrorHandler = new ErrorHandler($this->callableResolver, $this->responseFactory);
162+
$this->defaultErrorHandler = new ErrorHandler(
163+
$this->callableResolver,
164+
$this->responseFactory,
165+
$this->logger
166+
);
154167
}
155168

156169
return $this->callableResolver->resolve($this->defaultErrorHandler);

composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@
4040
"psr/http-factory": "^1.0",
4141
"psr/http-message": "^1.0",
4242
"psr/http-server-handler": "^1.0",
43-
"psr/http-server-middleware": "^1.0"
43+
"psr/http-server-middleware": "^1.0",
44+
"psr/log": "^1.1"
4445
},
4546
"require-dev": {
4647
"ext-simplexml": "*",

tests/AppTest.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
use Psr\Http\Message\UriInterface;
2020
use Psr\Http\Server\MiddlewareInterface;
2121
use Psr\Http\Server\RequestHandlerInterface;
22+
use Psr\Log\LoggerInterface;
2223
use ReflectionClass;
2324
use ReflectionProperty;
2425
use RuntimeException;
@@ -724,11 +725,14 @@ public function testAddErrorMiddleware()
724725
/** @var ResponseFactoryInterface $responseFactory */
725726
$responseFactory = $this->prophesize(ResponseFactoryInterface::class)->reveal();
726727

728+
/** @var LoggerInterface $logger */
729+
$logger = $this->prophesize(LoggerInterface::class)->reveal();
730+
727731
// Create the app.
728732
$app = new App($responseFactory);
729733

730734
// Add the error middleware.
731-
$errorMiddleware = $app->addErrorMiddleware(true, true, true);
735+
$errorMiddleware = $app->addErrorMiddleware(true, true, true, $logger);
732736

733737
// Check that the error middleware really has been added to the tip of the app middleware stack.
734738
$middlewareDispatcherProperty = new ReflectionProperty(App::class, 'middlewareDispatcher');

tests/Handlers/ErrorHandlerTest.php

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
namespace Slim\Tests\Handlers;
1212

1313
use Psr\Http\Message\ResponseInterface;
14+
use Psr\Log\LoggerInterface;
1415
use ReflectionClass;
1516
use ReflectionMethod;
1617
use ReflectionProperty;
@@ -28,6 +29,11 @@
2829

2930
class ErrorHandlerTest extends TestCase
3031
{
32+
private function getMockLogger(): LoggerInterface
33+
{
34+
return $this->createMock(LoggerInterface::class);
35+
}
36+
3137
public function testDetermineRenderer()
3238
{
3339
$handler = $this
@@ -303,16 +309,16 @@ public function testWriteToErrorLog()
303309
->createServerRequest('/', 'GET')
304310
->withHeader('Accept', 'application/json');
305311

306-
$handler = $this->getMockBuilder(ErrorHandler::class)
307-
->setConstructorArgs([
308-
'callableResolver' => $this->getCallableResolver(),
309-
'responseFactory' => $this->getResponseFactory(),
310-
])
311-
->setMethods(['logError'])
312-
->getMock();
312+
$logger = $this->getMockLogger();
313313

314-
$handler->expects(self::once())
315-
->method('logError')
314+
$handler = new ErrorHandler(
315+
$this->getCallableResolver(),
316+
$this->getResponseFactory(),
317+
$logger
318+
);
319+
320+
$logger->expects(self::once())
321+
->method('error')
316322
->willReturnCallback(static function (string $error) {
317323
self::assertStringNotContainsString(
318324
'set "displayErrorDetails" to true in the ErrorHandler constructor',
@@ -330,16 +336,16 @@ public function testWriteToErrorLogShowTip()
330336
->createServerRequest('/', 'GET')
331337
->withHeader('Accept', 'application/json');
332338

333-
$handler = $this->getMockBuilder(ErrorHandler::class)
334-
->setConstructorArgs([
335-
'callableResolver' => $this->getCallableResolver(),
336-
'responseFactory' => $this->getResponseFactory(),
337-
])
338-
->setMethods(['logError'])
339-
->getMock();
339+
$logger = $this->getMockLogger();
340+
341+
$handler = new ErrorHandler(
342+
$this->getCallableResolver(),
343+
$this->getResponseFactory(),
344+
$logger
345+
);
340346

341-
$handler->expects(self::once())
342-
->method('logError')
347+
$logger->expects(self::once())
348+
->method('error')
343349
->willReturnCallback(static function (string $error) {
344350
self::assertStringContainsString(
345351
'set "displayErrorDetails" to true in the ErrorHandler constructor',

0 commit comments

Comments
 (0)