diff --git a/src/Foundation/ErrorHandling/JsonApiFormatter.php b/src/Foundation/ErrorHandling/JsonApiFormatter.php index bebdf9d153..4196012e24 100644 --- a/src/Foundation/ErrorHandling/JsonApiFormatter.php +++ b/src/Foundation/ErrorHandling/JsonApiFormatter.php @@ -26,12 +26,21 @@ class JsonApiFormatter implements HttpFormatter public function format(HandledError $error, Request $request): Response { $document = new Document; - $document->setErrors([ - [ - 'status' => (string) $error->getStatusCode(), - 'code' => $error->getType(), - ], - ]); + + $data = [ + 'status' => (string) $error->getStatusCode(), + 'code' => $error->getType(), + ]; + $details = $error->getDetails(); + + if (empty($details)) { + $document->setErrors([$data]); + } else { + $document->setErrors(array_map( + function ($row) use ($data) { return array_merge($data, $row); }, + $details + )); + } return new JsonApiResponse($document, $error->getStatusCode()); } diff --git a/tests/integration/api/users/CreationTest.php b/tests/integration/api/users/CreationTest.php index 20963a0a82..4d2bd68a18 100644 --- a/tests/integration/api/users/CreationTest.php +++ b/tests/integration/api/users/CreationTest.php @@ -58,6 +58,32 @@ public function cannot_create_user_without_data() ); $this->assertEquals(422, $response->getStatusCode()); + + // The response body should contain details about the failed validation + $body = (string) $response->getBody(); + $this->assertJson($body); + $this->assertEquals([ + 'errors' => [ + [ + 'status' => '422', + 'code' => 'validation_error', + 'detail' => 'validation.required', + 'source' => ['pointer' => '/data/attributes/username'], + ], + [ + 'status' => '422', + 'code' => 'validation_error', + 'detail' => 'validation.required', + 'source' => ['pointer' => '/data/attributes/email'], + ], + [ + 'status' => '422', + 'code' => 'validation_error', + 'detail' => 'validation.required', + 'source' => ['pointer' => '/data/attributes/password'], + ], + ], + ], json_decode($body, true)); } /**