2016-04-10 13 views
1

Ich möchte Entity mit "PATCH" -Methode aktualisieren (nur die Felder aktualisieren, die übermittelt wurden).FOSRestBundle - PATCH funktioniert nicht wie sollte

/* Edit an existing Content entity. 
    * 
    * @Rest\Patch(
    *  "/{content}.{_format}", 
    *  requirements={"content" = "\d+"}, 
    *  defaults = { "_format" = "json" } 
    *) 
    * 
    * @Rest\View(serializerGroups={"user""admin"}) 
    * @param Content $content 
    * @return View 
    * @throws \NotFoundHttpException* 
    * 
    * @ApiDoc(
    * resource="/api/content/", 
    * description="Updates content data", 
    * 
    * input="ContentBundle\Form\ContentType", 
    * 
    * output={ 
    * "class"="EntriesBundle\Entity\Content", 
    * "parsers"={"Nelmio\ApiDocBundle\Parser\JmsMetadataParser"}, 
    * "groups"={"user","admin"} 
    * } 
    *) 
    */ 
public function editAction(Request $request, Content $content) 
{ 
    if (!$content) { 
     throw $this-createNotFoundException(); 
    } 

    $editForm = $this-createForm('ContentBundle\Form\ContentType', $content); 
    $editForm-submit($request-request-get($editForm-getName())); 

    $view = View::create() 
     -setSerializationContext(SerializationContext::create()-setGroups(['user'])); 

    if ($editForm-isSubmitted() && $editForm-isValid()) { 
     $em = $this-getDoctrine()-getManager(); 
     $em-persist($content); 
     $em-flush(); 

     $view 
      -setStatusCode(Codes::HTTP_OK) 
      -setTemplate("ContentBundle:content:show.html.twig") 
      -setTemplateVar('contents') 
      -setData($content); 

    } else { 
     $view 
      -setStatusCode(Codes::HTTP_BAD_REQUEST) 
      -setTemplateVar('error') 
      -setData($editForm) 
      -setTemplateData(['message' = $editForm-getErrors(true)]) 
      -setTemplate('ContentBundle:content:show.html.twig'); 
    } 

    return $this-get('fos_rest.view_handler')-handle($view); 
} 

Form:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('title', TextType::class) 
     ->add('description', TextareaType::class) 
     ->add('eng', CheckboxType::class, [ 
      'required' => false 
     ]); 
} 

Ich habe Einheit mit 'eng' auf TRUE. Wenn ich Abfrage ausführen, um nur title Feld zu aktualisieren, ändert sich eng zu false. und description zu null. Irgendwelche Ideen warum?

+0

Wenn ein Patch Anfrage mit, möchten Sie 'false' als zweites Argument übergeben zu 'Form :: submit()', damit fehlende Eigenschaften nicht gelöscht werden. – xabbuh

+0

Wenn Sie Ihren Booleschen Wert mit PATCH auf "Falsch" setzen, funktioniert er möglicherweise nicht. Siehe diese Frage für weitere Details und Lösung: http://StackOverflow.com/Questions/35187867/SYMFONY3-how-to-update-Boole-an-false-using-Patch-Method – Roubi

Antwort

0

ich habe es funktioniert.

Denken Sie daran, Leute, dass, wenn Sie PATCH Methode verwenden möchten Sie TextType statt ChoiceType in Ihrem Formular verwenden müssen:

public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('title', TextType::class) 
      ->add('description', TextareaType::class) 
      ->add('eng', TextType::class); 
    } 
1

Ich denke, dass, weil Sie nicht den Request Body Converter verwenden und Sie Ihre Routen manuell definieren, muss die Methode Ihres Formulars festgelegt werden.

versuchen, etwas wie folgt aus:

$editForm = $this->createForm(
    'ContentBundle\Form\ContentType', 
    $content, 
    ['method' => 'PATCH'] 
); 
+0

Nein, wird nicht funktionieren. Irgendwelche anderen Ideen? – breq

Verwandte Themen