78 lines
1.7 KiB
PHP
78 lines
1.7 KiB
PHP
|
<?php
|
||
|
|
||
|
namespace Shaarli\Api\Exceptions;
|
||
|
|
||
|
use Slim\Http\Response;
|
||
|
|
||
|
/**
|
||
|
* Abstract class ApiException
|
||
|
*
|
||
|
* Parent Exception related to the API, able to generate a valid Response (ResponseInterface).
|
||
|
* Also can include various information in debug mode.
|
||
|
*/
|
||
|
abstract class ApiException extends \Exception {
|
||
|
|
||
|
/**
|
||
|
* @var Response instance from Slim.
|
||
|
*/
|
||
|
protected $response;
|
||
|
|
||
|
/**
|
||
|
* @var bool Debug mode enabled/disabled.
|
||
|
*/
|
||
|
protected $debug;
|
||
|
|
||
|
/**
|
||
|
* Build the final response.
|
||
|
*
|
||
|
* @return Response Final response to give.
|
||
|
*/
|
||
|
public abstract function getApiResponse();
|
||
|
|
||
|
/**
|
||
|
* Creates ApiResponse body.
|
||
|
* In production mode, it will only return the exception message,
|
||
|
* but in dev mode, it includes additional information in an array.
|
||
|
*
|
||
|
* @return array|string response body
|
||
|
*/
|
||
|
protected function getApiResponseBody() {
|
||
|
if ($this->debug !== true) {
|
||
|
return $this->getMessage();
|
||
|
}
|
||
|
return [
|
||
|
'message' => $this->getMessage(),
|
||
|
'stacktrace' => get_class($this) .': '. $this->getTraceAsString()
|
||
|
];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Build the Response object to return.
|
||
|
*
|
||
|
* @param int $code HTTP status.
|
||
|
*
|
||
|
* @return Response with status + body.
|
||
|
*/
|
||
|
protected function buildApiResponse($code)
|
||
|
{
|
||
|
$style = $this->debug ? JSON_PRETTY_PRINT : null;
|
||
|
return $this->response->withJson($this->getApiResponseBody(), $code, $style);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param Response $response
|
||
|
*/
|
||
|
public function setResponse($response)
|
||
|
{
|
||
|
$this->response = $response;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param bool $debug
|
||
|
*/
|
||
|
public function setDebug($debug)
|
||
|
{
|
||
|
$this->debug = $debug;
|
||
|
}
|
||
|
}
|