AmeliaErrorHandler.php
48 lines
| 1 | <?php |
| 2 | |
| 3 | /** |
| 4 | * @copyright © Melograno Ventures. All rights reserved. |
| 5 | * @licence See COPYING.md for license details. |
| 6 | */ |
| 7 | |
| 8 | namespace AmeliaBooking\Infrastructure\Common; |
| 9 | |
| 10 | use AmeliaBooking\Application\Common\Exceptions\AccessDeniedException; |
| 11 | use AmeliaBooking\Application\Controller\Controller; |
| 12 | use AmeliaBooking\Infrastructure\Common\Exceptions\NotFoundException; |
| 13 | use AmeliaVendor\Psr\Http\Message\ResponseInterface; |
| 14 | use Slim\Exception\HttpException; |
| 15 | use Slim\Handlers\ErrorHandler; |
| 16 | |
| 17 | class AmeliaErrorHandler extends ErrorHandler |
| 18 | { |
| 19 | protected function respond(): ResponseInterface |
| 20 | { |
| 21 | $exception = $this->exception; |
| 22 | $request = $this->request; |
| 23 | |
| 24 | if ($exception instanceof AccessDeniedException) { |
| 25 | $status = Controller::STATUS_FORBIDDEN; |
| 26 | } elseif ($exception instanceof NotFoundException) { |
| 27 | $status = Controller::STATUS_NOT_FOUNT; |
| 28 | } elseif ($exception instanceof HttpException) { |
| 29 | $status = $exception->getCode(); |
| 30 | } else { |
| 31 | $status = Controller::STATUS_INTERNAL_SERVER_ERROR; |
| 32 | } |
| 33 | |
| 34 | $responseMessage = ['message' => $exception->getMessage()]; |
| 35 | |
| 36 | $queryParams = $request->getQueryParams(); |
| 37 | if (!empty($queryParams['showAmeliaSqlExceptions'])) { |
| 38 | $prev = $exception->getPrevious(); |
| 39 | $responseMessage['exception'] = $prev ? $prev->getMessage() : ''; |
| 40 | } |
| 41 | |
| 42 | $response = $this->responseFactory->createResponse($status); |
| 43 | $response->getBody()->write(json_encode($responseMessage)); |
| 44 | |
| 45 | return $response->withHeader('Content-Type', 'application/json'); |
| 46 | } |
| 47 | } |
| 48 |