Bundle provides simple serialization for symfony form errors in JSON REST API.
- Install component via composer
composer require 4xxi/rest-request-errors
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
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
}