2015-06-11 24 views
7

JSON biçiminde bir REST API uygulamak için Symfony 2 ile FOSRestBundle kullanıyorum.İstisna formatını FOSRestBundle ve Symfony 2 ile nasıl özelleştirirsiniz?

Ben tüm API istisnalar böyle spesifik bir JSON biçiminde iade edilecek istiyorum:

{ 
    "success": false, 
    "exception": { 
     "exceptionClass": "SomeNastyException", 
     "message": "A nasty exception occurred" 
    } 
} 

Bunu nasıl yapacağım?

ExceptionController ile çalışmayı denedim, ancak mantığı aşırı yüklenmek için çok karmaşık görünüyor.

+0

Bunu çözdü mü? Aynı sorunum var –

cevap

10

Not Not: Bu yalnızca FOSResBundle < 2.0 için geçerlidir. FOSResBundle> = 2.0 için lütfen İstisna Normalleştiriciler kullanın, bkz. examples.

docs gibi özel kural sarıcı işleyicisi yazabilirsiniz.

<?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 

Tepki örneği:

{"success":false,"exception":{"exceptionClass":"Symfony\\Component\\HttpKernel\\Exception\\NotFoundHttpException","message":"Not Found"}} 
+1

Bu cevabın artık geçerli olmadığını düşünüyorum. FOSRestBundle artık göremediğim bir istisna sarıcı işleyici sınıfı veya arabirim içermiyor. – JackalopeZero

+0

Bu, FOS Rest'in v2.0 sürümünden bu yana kullanımdan kaldırılmıştır. Diğer bir fikir? –

+0

Evet, kullanımdan kaldırıldı çünkü artık diziselleştiricinize bağlı.Dolayısıyla, diziselleştiricinizi kullanarak istisnayı nasıl değiştireceğiniz yolunu bulmalısınız. Örnek eklerdim ama korkarım cevap çok büyük olacak. Örneğin JMSSerializerBundle https://github.com/FriendsOfSymfony/FOSRestBundle/blob/2.0/Serializer/Normalizer/ExceptionHandler.php için normalleştirici –

5

ben üzerinden bu iş parçacığı üzerinde bir kaç kez indi ettik Senin durumunda son birkaç gün. Paketteki V2'yi kullandığım durumdaki herkes için, FOSRestBundle'ı yararlı hale getirmek için aşağıdaki kaynağı bulabilirsiniz.

ExceptionWrapperHandlerInterface yerine serializer kullanımını kapsar.

https://github.com/FriendsOfSymfony/FOSRestBundle/blob/master/UPGRADING-2.0.md

  • exception_wrapper_handler yapılandırma seçeneği

    çıkarıldı. Bunun yerine normalleştiricileri kullanın.

önce:

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

sonra (eğer Symfony'nin serileştirici kullanılmalıdır varsa):

services.yml

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

normalleştirici

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