2016-10-23 1 views
0

Utilisation de FOSRestBundle et JMSSerializerBundle Je ne parviens pas à recouvrir mes formulaires non valides dans une exception via \FOS\RestBundle\Serializer\Normalizer\FormErrorHandler, comme décrit here.La forme non valide n'est pas normalisée lors de l'utilisation de FOSRestBundle

Au lieu de la réponse HTTP pour contenir l'objet JSON comme décrit dans l'URL ci-dessus (par exemple avec code, message et errors clés), je vois la représentation JSON sérialisée de l'objet Form (je le JMSSerializerBundle enregistré). L'état HTTP ne se réglé sur 400. Le JSON de la réponse:

{ 
    "children": { 
    "title": {}, 
    "sourceAddress": { 
     "errors": [ 
     "This value should not be blank." 
     ] 
    }, 
    "payload": {} 
    } 
} 

config associée et code:

config.yml:

fos_rest: 
    view: 
     view_response_listener: 'force' 
     formats: 
      json: true 
    format_listener: 
     rules: 
      - { path: ^/, fallback_format: json } 
    exception: 
     enabled: true 

Action de contrôleur:

public function postCampaignsAction(Request $request) 
{ 
    $campaign = new Campaign(); 

    $form = $this->createForm(CampaignType::class, $campaign); 
    $form->submit($request->request->all()); 

    if ($form->isValid()) { 
     $em = $this->getDoctrine()->getManager(); 
     $em->persist($campaign); 
     $em->flush(); 

     return View::createRouteRedirect('get_campaign', [ 
      'campaign' => $campaign->getId(), 
     ]); 
    } 

    return $form; 
} 

Toute aide est très appréciée! :)

EDIT: J'ai réussi à obtenir le résultat souhaité en ajoutant ceci à parameters.yml:

parameters: 
     jms_serializer.form_error_handler.class: FOS\RestBundle\Serializer\Normalizer\FormErrorHandler 

Je ne comprends pas pourquoi cela est nécessaire cependant, parce que FOSRestBundle/Resources/config/serializer.xml contient déjà:

<parameters> 
     <!-- Override the default jms FormErrorHandler --> 
     <parameter key="jms_serializer.form_error_handler.class">FOS\RestBundle\Serializer\Normalizer\FormErrorHandler</parameter> 
    </parameters> 

Cela peut-il être un bug dans FOSRestBundle?

Répondre

1

J'ai découvert ce que j'ai fait de mal: Je mets FOSRestBundle avant JMSSerializerBundle dans le tableau de faisceaux à enregistrer. L'ordre dans lequel JMSSerializerBundle et FOSRestBundle sont enregistrés dans app/AppKernel.php est pris en compte. Si FOSRestBundle est avantJMSSerializerBundle dans le tableau retourné dans \AppKernel::registerBundles, le paramètre de remplacement jms_serializer.form_error_handler.class dans le fichier Resources/config/serializer.xml de FOSRestBundle n'a aucun effet.