I'm using FOSRestBundle with Symfony 2 to implement a REST API in JSON format.
I want all API exceptions to be returned in a specific JSON format like this:
{
"success": false,
"exception": {
"exceptionClass": "SomeNastyException",
"message": "A nasty exception occurred"
}
}
How do I do this?
I've tried to fiddle with ExceptionController, but it's logic seems too complicated to be easily overloaded.
Note: This works only for FOSResBundle < 2.0. For FOSResBundle >= 2.0 please use Exception Normalizers, see examples.
You can write custom exception wrapper handler like in docs. In your case:
<?php
//AppBundle\Handler\MyExceptionWrapperHandler.php
namespace AppBundle\Handler;
use FOS\RestBundle\Util\ExceptionWrapper;
use FOS\RestBundle\View\ExceptionWrapperHandlerInterface;
class MyExceptionWrapperHandler implements ExceptionWrapperHandlerInterface {
public function wrap($data)
{
/** @var \Symfony\Component\Debug\Exception\FlattenException $exception */
$exception = $data['exception'];
$newException = array(
'success' => false,
'exception' => array(
'exceptionClass' => $exception->getClass(),
'message' => $data['status_text']
)
);
return $newException;
}
}
fos_rest:
routing_loader:
default_format: json
view:
view_response_listener: force
exception_wrapper_handler: AppBundle\Handler\MyExceptionWrapperHandler
exception:
enabled: true
Response example:
{"success":false,"exception":{"exceptionClass":"Symfony\\Component\\HttpKernel\\Exception\\NotFoundHttpException","message":"Not Found"}}
I've landed on this thread a number of times over the last few days. For anyone else in my situation where you are using V2 of the bundle, you may find the following resource on upgrading FOSRestBundle useful.
It covers the use of serializer in place of ExceptionWrapperHandlerInterface.
https://github.com/FriendsOfSymfony/FOSRestBundle/blob/master/UPGRADING-2.0.md
Before:
fos_rest:
view:
exception_wrapper_handler: AppBundle\ExceptionWrapperHandler
namespace AppBundle;
class ExceptionWrapperHandler implements ExceptionWrapperHandlerInterface
{
public function wrap($data)
{
return new ExceptionWrapper(array('status_code' => 'foo'));
}
}
After (if you use the Symfony serializer):
services:
app_bundle.exception_normalizer:
class: AppBundle\Normalizer\ExceptionNormalizer
tags:
- { name: serializer.normalizer }
namespace AppBundle\Normalizer;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
class ExceptionNormalizer implements NormalizerInterface
{
public function normalize($object, $format = null, array $context = array())
{
return array('status_code' => 'foo');
}
public function supportsNormalization($data, $format = null)
{
return $data instanceof \My\Exception;
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With