4xxi / rest-request-errors
Bundle providing serialization of REST request errors
Installs: 2 034
Dependents: 0
Suggesters: 0
Security: 0
Stars: 2
Watchers: 4
Forks: 0
Open Issues: 1
Type:symfony-bundle
Requires
- php: ^7.1.3
- symfony/config: *
- symfony/dependency-injection: *
- symfony/http-foundation: *
- symfony/http-kernel: *
- symfony/serializer: *
Requires (Dev)
Suggests
- symfony/form: Enable support for forms
This package is auto-updated.
Last update: 2023-07-28 15:44:21 UTC
README
Bundle provides simple serialization for symfony form errors in JSON REST API.
Installation
- Install component via composer
composer require 4xxi/rest-request-errors
Usage
For Symfony forms:
use Fourxxi\RestRequestError\Exception\FormInvalidRequestException; if (!$form->isValid()) { throw new FormInvalidRequestException($form); }
For custom errors array:
use Fourxxi\RestRequestError\Exception\ArrayInvalidRequestException; throw new ArrayInvalidRequestException([ 'field1' => 'errorValue', 'field2' => 'someAnotherError' ]);
Examples above produces response:
{ "errors": [ ], "children": { "username": { "errors": [ "Some error for form field" ], "children": [] } } }
If your application doesn't have exception listener, you can use bundle provided exception listener.
To enable it, add configuration yaml into config/packages/rest_request_error.yaml
with following content:
rest_request_error: use_exception_listener: true
Decorating normalizer
If you want to modify errors response payload, you can decorate bundle normalizer with your own
Add to services.yaml
decorate service
App\Serializer\CustomExceptionNormalizer: decorates: Fourxxi\RestRequestError\Serializer\InvalidRequestExceptionNormalizer arguments: - '@App\Serializer\CustomExceptionNormalizer.inner'
And create own decorator class:
final class CustomExceptionNormalizer implements NormalizerInterface { /** * @var NormalizerInterface */ private $normalizer; public function __construct(NormalizerInterface $normalizer) { $this->normalizer = $normalizer; } /** * @param InvalidRequestExceptionInterface $object */ public function normalize($object, string $format = null, array $context = []) { $normalized = $this->normalizer->normalize($object, $format, $context); $normalized['code'] = $object->getStatusCode(); return $normalized; } public function supportsNormalization($data, string $format = null) { return $this->normalizer->supportsNormalization($data, $format); } }
Result:
{ "errors": [], "children": { "test": { "errors": [ "foo" ], "children": [] } }, "code": 400 }