2016-08-03 17 views
0

Ich habe den Serializer in Symfony arbeiten, ich kann GET und POST Json mit dem EntityController. Ich habe ein Bearbeitungsformular, wo ein existierendes Objekt/Objekt bearbeitet und gespeichert werden kann. Wenn das bearbeitete Objekt gepostet wird (als ein json-Objekt), werden die json-Objekte deserialisiert, persistiert und in die Datenbank geleert. So weit, so gut, zumindest solange ich keine assoziierten (ManyToMany) Entitäten poste.Symfony2 (deserialize): update entity (mit association) mit json

Ich habe zwei Entitäten (mit ManyToMany Vereinigung):

  1. Objekt

  2. Element

Dies funktioniert (siehe auch jsonEditAction in der Steuerung (unten geschrieben)):

{ 
    "id": "1", 
    "name": "object 1" 
} 

Meine Frage ist:

{ 
    "id": "1", 
    "name": "object 1", 
    "elements": { 
     "0": "1", 
     "1": "2" 
    } 
} 

Wenn ich poste oben json ich die folgende Mitteilung von Symfony erhalten:

Wie ich das Objekt mit assoziierten Unternehmen in der json, wie diese bearbeiten können

"message": "Expected Argument vom Typ \" AppBundle \ Entity \ Element \ "\ "integer \" gegeben", "class": "Symfony \ Component \ PropertyAccess \ Exception \ InvalidArgumentException"

Für weitere Informationen; dies ist der editAction wo die Json entsandt ist:

public function jsonEditAction(Request $request, $id) { 
    $serializer = $this->initSerializer(); 
    $em = $this->getDoctrine()->getManager(); 

    $object = $em->getRepository('AppBundle:Object')->findOneById($id); 

    $data = $request->getContent(); 

    $serializer->deserialize($data, 'AppBundle\Entity\Object', 'json', array('object_to_populate' => $object)); 

    try { 
     $em->persist($object); 
     $em->flush(); 

     $view = $this->view($object, 200) 
       ->setTemplate("object/json.html.twig"); 
    } catch (Exception $e) { 
     $view = $this->view('Caught exception: ' . $e->getMessage() . "\n", 500) 
       ->setTemplate("object/json.html.twig"); 
    } 

    return $this->handleView($view); 
} 

private function initSerializer() { 
    $encoders = array(new JsonEncoder()); 
    $normalizers = array(new ObjectNormalizer()); 

    $serializer = new Serializer($normalizers, $encoders); 

    return $serializer; 
} ` 

Sollte ich mit Elementen zum Array gehen und sie eins nach dem anderen und dann fügen sie dem ‚Objekt‘ Einheit finden? Oder gibt es eine "eingebaute" Lösung im Serializer, die ich übersehen habe/nicht gesehen habe?

UPDATE: die JSON Auch wie Alexey vorgeschlagen hat nicht funktioniert:

{ 
    "id": 2, 
    "name": "Object 2c", 
    "elements": [{ 
     "id": 1 
    }, { 
     "id": 2 
    }] 
} 

UPDATE: Meine Frage ist ein Duplikat: Deserialize an entity with a relationship with Symfony Serializer Component Es gibt eine Pull-Anforderung erstellt ist und wird in Symfony 3.2 zusammengeführt ...

+0

Vielleicht sind Sie auf der Suche nach Symfony [Data Transformator] (http://symfony.com/doc/current/form/data_transformers.html) – Jeet

+0

Aber so lange wie Serialisierer betroffen ist, sollte es Transformator implizit handhaben, ich verwendet [JMSSerializer] (https://github.com/schmittjoh/JMSSerializerBundle) mit [FOSRestBundle] (http: // symfony.com/doc/aktuelle/Bundles/FOSRestBundle/index.html). Aber ich hatte nie ein solches Problem. Das liegt daran, dass selbst die Daten in sauberem JSON übergeben wurden. Ich habe immer einen Formulartyp verwendet, um die Postdaten zu verarbeiten. – Jeet

+0

@Jeet: können Sie mir ein Beispiel Ihres Handlers zeigen? –

Antwort

0

Sie haben einen schlechten JSON, Symfony sagt Ihnen das Gleiche.

Eine gute JSON kann wie folgt aussehen:

{ 
    "id": "1", 
    "name": "object 1", 
    "elements": [ 
     {"id": "254", "name": "element 254"}, 
     {"id": "301", "name": "element 301"} 
    ] 
} 

versucht Symfony ein Element Objekt aus "1" und "2" in Ihrem ursprünglichen JSON deserialisieren und schlägt fehl.

+0

Hallo Alexey, ich habe einen JSON wie oben gepostet, aber ich bekomme immer noch den gleichen Fehler –