1
0
mirror of https://github.com/flarum/core.git synced 2025-10-12 07:24:27 +02:00

Use exception handlers instead of JsonApiSerializableInterface

This commit is contained in:
Toby Zerner
2015-10-26 11:12:10 +10:30
parent f3612261ec
commit 68498cedae
14 changed files with 326 additions and 141 deletions

View File

@@ -10,32 +10,24 @@
namespace Flarum\Api\Middleware;
use Flarum\Api\JsonApiResponse;
use Flarum\Foundation\Application;
use Illuminate\Contracts\Validation\ValidationException;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Flarum\Api\ErrorHandler;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Tobscure\JsonApi\Document;
use Tobscure\JsonApi\Exception\JsonApiSerializableInterface;
use Zend\Diactoros\Response\JsonResponse;
use Zend\Stratigility\ErrorMiddlewareInterface;
use Flarum\Core;
use Exception;
class HandleErrors implements ErrorMiddlewareInterface
{
/**
* @var Application
* @var ErrorHandler
*/
private $app;
protected $errorHandler;
/**
* @param Application $app
* @param ErrorHandler $errorHandler
*/
public function __construct(Application $app)
public function __construct(ErrorHandler $errorHandler)
{
$this->app = $app;
$this->errorHandler = $errorHandler;
}
/**
@@ -43,47 +35,6 @@ class HandleErrors implements ErrorMiddlewareInterface
*/
public function __invoke($e, Request $request, Response $response, callable $out = null)
{
return $this->handle($e);
}
public function handle(Exception $e)
{
if ($e instanceof JsonApiSerializableInterface) {
$status = $e->getStatusCode();
$errors = $e->getErrors();
} elseif ($e instanceof ValidationException) {
$status = 422;
$errors = $e->errors()->toArray();
$errors = array_map(function ($field, $messages) {
return [
'detail' => implode("\n", $messages),
'source' => ['pointer' => '/data/attributes/' . $field],
];
}, array_keys($errors), $errors);
} elseif ($e instanceof ModelNotFoundException) {
$status = 404;
$errors = [];
} else {
$status = 500;
$error = [
'code' => $status,
'title' => 'Internal Server Error'
];
if ($this->app->inDebugMode()) {
$error['detail'] = (string) $e;
}
$errors = [$error];
}
$document = new Document;
$document->setErrors($errors);
return new JsonApiResponse($document, $status);
return $this->errorHandler->handle($e);
}
}