Refactor error handling internally to follow RFC7807 (#362)

* Refactor error handling internally to follow RFC7807

* style fixes
This commit is contained in:
Nabeel S
2019-08-21 08:17:44 -04:00
committed by GitHub
parent 91a5eb535d
commit 182aabf426
25 changed files with 692 additions and 144 deletions

View File

@@ -0,0 +1,51 @@
<?php
namespace App\Exceptions\Converters;
use App\Exceptions\HttpException;
use Exception;
class GenericException extends HttpException
{
private $exception;
public function __construct(Exception $exception)
{
$this->exception = $exception;
parent::__construct(
503,
$exception->getMessage()
);
}
/**
* Return the RFC 7807 error type (without the URL root)
*/
public function getErrorType(): string
{
return 'internal-error';
}
/**
* Get the detailed error string
*/
public function getErrorDetails(): string
{
return $this->getMessage();
}
/**
* Return an array with the error details, merged with the RFC7807 response
*/
public function getErrorMetadata(): array
{
// Only add trace if in dev
if (config('app.env') === 'dev') {
return [
'trace' => $this->exception->getTrace()[0],
];
}
return [];
}
}

View File

@@ -0,0 +1,44 @@
<?php
namespace App\Exceptions\Converters;
use App\Exceptions\HttpException;
use Exception;
class NotFound extends HttpException
{
private $exception;
public function __construct(Exception $exception)
{
$this->exception = $exception;
parent::__construct(
404,
$exception->getMessage()
);
}
/**
* Return the RFC 7807 error type (without the URL root)
*/
public function getErrorType(): string
{
return 'not-found';
}
/**
* Get the detailed error string
*/
public function getErrorDetails(): string
{
return $this->getMessage();
}
/**
* Return an array with the error details, merged with the RFC7807 response
*/
public function getErrorMetadata(): array
{
return [];
}
}

View File

@@ -0,0 +1,51 @@
<?php
namespace App\Exceptions\Converters;
use App\Exceptions\HttpException;
use Symfony\Component\HttpKernel\Exception\HttpException as SymfonyHttpException;
class SymfonyException extends HttpException
{
private $exception;
public function __construct(SymfonyHttpException $exception)
{
$this->exception = $exception;
parent::__construct(
$exception->getStatusCode(),
$exception->getMessage()
);
}
/**
* Return the RFC 7807 error type (without the URL root)
*/
public function getErrorType(): string
{
return 'internal-error';
}
/**
* Get the detailed error string
*/
public function getErrorDetails(): string
{
return $this->getMessage();
}
/**
* Return an array with the error details, merged with the RFC7807 response
*/
public function getErrorMetadata(): array
{
// Only add trace if in dev
if (config('app.env') === 'dev') {
return [
'trace' => $this->exception->getTrace()[0],
];
}
return [];
}
}

View File

@@ -0,0 +1,63 @@
<?php
namespace App\Exceptions\Converters;
use App\Exceptions\HttpException;
use Illuminate\Support\Facades\Log;
use Illuminate\Validation\ValidationException as IlluminateValidationException;
class ValidationException extends HttpException
{
private $validationException;
private $errorDetail;
private $errors;
public function __construct(IlluminateValidationException $validationException)
{
$this->validationException = $validationException;
$this->processValidationErrors();
parent::__construct(
400,
'Validation exception'
);
}
private function processValidationErrors()
{
$error_messages = [];
$this->errors = $this->validationException->errors();
foreach ($this->errors as $field => $error) {
$error_messages[] = implode(', ', $error);
}
$this->errorDetail = implode(', ', $error_messages);
// Log::error('Validation errors', $this->errors);
}
/**
* Return the RFC 7807 error type (without the URL root)
*/
public function getErrorType(): string
{
return 'validation-exception';
}
/**
* Return an array with the error details, merged with the RFC7807 response
*/
public function getErrorDetails(): string
{
return $this->errorDetail;
}
/**
* Return an array with the error details, merged with the RFC7807 response
*/
public function getErrorMetadata(): array
{
return [
'errors' => $this->errors,
];
}
}