From f5988bae23a0c56477ceaa794c321008ae14986a Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Sun, 5 Jun 2016 09:25:26 +0930 Subject: [PATCH] Distinguish between attributes/relationships in ValidationException This exception could be a candidate for inclusion in tobscure/json-api... --- .../Handler/ValidationExceptionHandler.php | 19 ++++++++++++------- src/Core/Exception/ValidationException.php | 19 ++++++++++++++----- .../ValidationExceptionHandlerTest.php | 15 ++++++++++++--- 3 files changed, 38 insertions(+), 15 deletions(-) diff --git a/src/Api/Handler/ValidationExceptionHandler.php b/src/Api/Handler/ValidationExceptionHandler.php index 7b2ce70d1..b8cc14552 100644 --- a/src/Api/Handler/ValidationExceptionHandler.php +++ b/src/Api/Handler/ValidationExceptionHandler.php @@ -30,18 +30,23 @@ class ValidationExceptionHandler implements ExceptionHandlerInterface */ public function handle(Exception $e) { - $status = 422; + $errors = array_merge( + $this->buildErrors($e->getAttributes(), '/data/attributes'), + $this->buildErrors($e->getRelationships(), '/data/relationships') + ); - $messages = $e->getMessages(); - $errors = array_map(function ($path, $detail) use ($status) { + return new ResponseBag(422, $errors); + } + + private function buildErrors(array $messages, $pointer) + { + return array_map(function ($path, $detail) use ($pointer) { return [ - 'status' => (string) $status, + 'status' => '422', 'code' => 'validation_error', 'detail' => $detail, - 'source' => ['pointer' => "/data/attributes/$path"] + 'source' => ['pointer' => $pointer.'/'.$path] ]; }, array_keys($messages), $messages); - - return new ResponseBag($status, $errors); } } diff --git a/src/Core/Exception/ValidationException.php b/src/Core/Exception/ValidationException.php index b32959f59..172f56ba6 100644 --- a/src/Core/Exception/ValidationException.php +++ b/src/Core/Exception/ValidationException.php @@ -14,17 +14,26 @@ use Exception; class ValidationException extends Exception { - protected $messages; + protected $attributes; + protected $relationships; - public function __construct(array $messages) + public function __construct(array $attributes, array $relationships = []) { - $this->messages = $messages; + $this->attributes = $attributes; + $this->relationships = $relationships; + + $messages = [implode("\n", $attributes), implode("\n", $relationships)]; parent::__construct(implode("\n", $messages)); } - public function getMessages() + public function getAttributes() { - return $this->messages; + return $this->attributes; + } + + public function getRelationships() + { + return $this->relationships; } } diff --git a/tests/Flarum/Api/Handler/ValidationExceptionHandlerTest.php b/tests/Flarum/Api/Handler/ValidationExceptionHandlerTest.php index 7fff7d56f..a0b43ac3c 100644 --- a/tests/Flarum/Api/Handler/ValidationExceptionHandlerTest.php +++ b/tests/Flarum/Api/Handler/ValidationExceptionHandlerTest.php @@ -32,15 +32,24 @@ class ValidationExceptionHandlerTest extends TestCase public function test_managing_exceptions() { - $response = $this->handler->handle(new ValidationException(['There was an error'])); + $response = $this->handler->handle(new ValidationException( + ['foo' => 'Attribute error'], + ['bar' => 'Relationship error'] + )); $this->assertEquals(422, $response->getStatus()); $this->assertEquals([ [ 'status' => '422', 'code' => 'validation_error', - 'detail' => 'There was an error', - 'source' => ['pointer' => '/data/attributes/0'] + 'detail' => 'Attribute error', + 'source' => ['pointer' => '/data/attributes/foo'] + ], + [ + 'status' => '422', + 'code' => 'validation_error', + 'detail' => 'Relationship error', + 'source' => ['pointer' => '/data/relationships/bar'] ] ], $response->getErrors()); }