diff --git a/Slim/Handlers/ErrorHandler.php b/Slim/Handlers/ErrorHandler.php index f1975b533..8ac1755df 100644 --- a/Slim/Handlers/ErrorHandler.php +++ b/Slim/Handlers/ErrorHandler.php @@ -42,6 +42,11 @@ class ErrorHandler implements ErrorHandlerInterface */ protected $defaultErrorRenderer = HtmlErrorRenderer::class; + /** + * @var ErrorRendererInterface|string|callable + */ + protected $logErrorRenderer = PlainTextErrorRenderer::class; + /** * @var array */ @@ -259,6 +264,16 @@ public function setDefaultErrorRenderer(string $contentType, $errorRenderer): vo $this->defaultErrorRenderer = $errorRenderer; } + /** + * Set the renderer for the error logger + * + * @param ErrorRendererInterface|string|callable $logErrorRenderer + */ + public function setLogErrorRenderer($logErrorRenderer): void + { + $this->logErrorRenderer = $logErrorRenderer; + } + /** * Write to the error log if $logErrors has been set to true * @@ -266,8 +281,8 @@ public function setDefaultErrorRenderer(string $contentType, $errorRenderer): vo */ protected function writeToErrorLog(): void { - $renderer = new PlainTextErrorRenderer(); - $error = $renderer->__invoke($this->exception, $this->logErrorDetails); + $renderer = $this->callableResolver->resolve($this->logErrorRenderer); + $error = $renderer($this->exception, $this->logErrorDetails); $error .= "\nView in rendered output by enabling the \"displayErrorDetails\" setting.\n"; $this->logError($error); } diff --git a/tests/Handlers/ErrorHandlerTest.php b/tests/Handlers/ErrorHandlerTest.php index df5d897df..8993cc3ab 100644 --- a/tests/Handlers/ErrorHandlerTest.php +++ b/tests/Handlers/ErrorHandlerTest.php @@ -11,6 +11,9 @@ use Psr\Http\Message\ResponseInterface; use ReflectionClass; +use ReflectionMethod; +use ReflectionProperty; +use RuntimeException; use Slim\Error\Renderers\HtmlErrorRenderer; use Slim\Error\Renderers\JsonErrorRenderer; use Slim\Error\Renderers\PlainTextErrorRenderer; @@ -18,6 +21,7 @@ use Slim\Exception\HttpMethodNotAllowedException; use Slim\Exception\HttpNotFoundException; use Slim\Handlers\ErrorHandler; +use Slim\Interfaces\CallableResolverInterface; use Slim\Tests\Mocks\MockCustomException; use Slim\Tests\TestCase; @@ -322,7 +326,7 @@ public function testDefaultErrorRenderer() ->withHeader('Accept', 'application/unknown'); $handler = new ErrorHandler($this->getCallableResolver(), $this->getResponseFactory()); - $exception = new \RuntimeException(); + $exception = new RuntimeException(); /** @var ResponseInterface $res */ $res = $handler->__invoke($request, $exception, true, true, true); @@ -330,4 +334,29 @@ public function testDefaultErrorRenderer() $this->assertTrue($res->hasHeader('Content-Type')); $this->assertEquals('text/html', $res->getHeaderLine('Content-Type')); } + + public function testLogErrorRenderer() + { + $renderer = function () { + return ''; + }; + + $callableResolverProphecy = $this->prophesize(CallableResolverInterface::class); + $callableResolverProphecy + ->resolve('logErrorRenderer') + ->willReturn($renderer) + ->shouldBeCalledOnce(); + + $handler = new ErrorHandler($callableResolverProphecy->reveal(), $this->getResponseFactory()); + $handler->setLogErrorRenderer('logErrorRenderer'); + + $exception = new RuntimeException(); + $exceptionProperty = new ReflectionProperty($handler, 'exception'); + $exceptionProperty->setAccessible(true); + $exceptionProperty->setValue($handler, $exception); + + $writeToErrorLogMethod = new ReflectionMethod($handler, 'writeToErrorLog'); + $writeToErrorLogMethod->setAccessible(true); + $writeToErrorLogMethod->invoke($handler); + } }