diff --git a/src/Exceptions/Handler.php b/src/Exceptions/Handler.php index ee15717a..0503b5b7 100644 --- a/src/Exceptions/Handler.php +++ b/src/Exceptions/Handler.php @@ -54,8 +54,10 @@ class Handler /** * @param Throwable $e + * @param bool $return + * @return string */ - public function exceptionHandler($e) + public function exceptionHandler($e, $return = false) { if (!$this->request instanceof Request) { $this->request = new Request(); @@ -63,8 +65,19 @@ class Handler $handler = $this->handler[$this->environment]; $handler->report($e); + ob_start(); $handler->render($this->request, $e); + + if ($return) { + $output = ob_get_contents(); + ob_end_clean(); + return $output; + } + + http_response_code(500); + ob_end_flush(); $this->die(); + return ''; } /** diff --git a/src/Exceptions/Handlers/Whoops.php b/src/Exceptions/Handlers/Whoops.php index 73352105..630aca1d 100644 --- a/src/Exceptions/Handlers/Whoops.php +++ b/src/Exceptions/Handlers/Whoops.php @@ -34,6 +34,8 @@ class Whoops extends Legacy implements HandlerInterface $whoops = $this->app->make(WhoopsRunner::class); $handler = $this->getPrettyPageHandler($e); $whoops->pushHandler($handler); + $whoops->writeToOutput(false); + $whoops->allowQuit(false); if ($request->isXmlHttpRequest()) { $handler = $this->getJsonResponseHandler(); diff --git a/tests/Unit/Exceptions/HandlerTest.php b/tests/Unit/Exceptions/HandlerTest.php index 40202be8..7987f9d6 100644 --- a/tests/Unit/Exceptions/HandlerTest.php +++ b/tests/Unit/Exceptions/HandlerTest.php @@ -49,15 +49,19 @@ class HandlerTest extends TestCase public function testExceptionHandler() { $exception = new Exception(); + $errorMessage = 'Oh noes, an error!'; /** @var HandlerInterface|Mock $handlerMock */ $handlerMock = $this->getMockForAbstractClass(HandlerInterface::class); - $handlerMock->expects($this->once()) + $handlerMock->expects($this->atLeastOnce()) ->method('report') ->with($exception); - $handlerMock->expects($this->once()) + $handlerMock->expects($this->atLeastOnce()) ->method('render') - ->with($this->isInstanceOf(Request::class), $exception); + ->with($this->isInstanceOf(Request::class), $exception) + ->willReturnCallback(function () use ($errorMessage) { + echo $errorMessage; + }); /** @var Handler|Mock $handler */ $handler = $this->getMockBuilder(Handler::class) @@ -68,7 +72,11 @@ class HandlerTest extends TestCase $handler->setHandler(Handler::ENV_PRODUCTION, $handlerMock); + $this->expectOutputString($errorMessage); $handler->exceptionHandler($exception); + + $return = $handler->exceptionHandler($exception, true); + $this->assertEquals($errorMessage, $return); } /** diff --git a/tests/Unit/Exceptions/Handlers/WhoopsTest.php b/tests/Unit/Exceptions/Handlers/WhoopsTest.php index 261ee83f..4062979b 100644 --- a/tests/Unit/Exceptions/Handlers/WhoopsTest.php +++ b/tests/Unit/Exceptions/Handlers/WhoopsTest.php @@ -72,6 +72,14 @@ class WhoopsTest extends TestCase [$prettyPageHandler], [$jsonResponseHandler] ); + $whoopsRunner + ->expects($this->once()) + ->method('writeToOutput') + ->with(false); + $whoopsRunner + ->expects($this->once()) + ->method('allowQuit') + ->with(false); $whoopsRunner ->expects($this->once()) ->method('handleException')