How do you customize exception format with FOSRestBundle and Symfony 2?

前端 未结 2 2028
礼貌的吻别
礼貌的吻别 2020-12-30 10:40

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:

相关标签:
2条回答
  • 2020-12-30 11:22

    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;
        }
    }
    

    app/config/config.yml

    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"}}
    
    0 讨论(0)
  • 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

    • The exception_wrapper_handler config option was removed. Use normalizers instead.

    Before:

    config.yml

    fos_rest:
       view:
           exception_wrapper_handler: AppBundle\ExceptionWrapperHandler
    

    Handler

    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.yml

    services:
       app_bundle.exception_normalizer:
           class: AppBundle\Normalizer\ExceptionNormalizer
           tags:
               - { name: serializer.normalizer }
    

    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;
       }
    }
    
    0 讨论(0)
提交回复
热议问题