2016-08-03 3 views
0

Я получил сериализатор в Symfony, я могу GET и POST json с EntityController. У меня есть форма редактирования, где существующий объект/объект можно редактировать и сохранять. Когда отредактированный объект отправляется (как объект json), объекты json становятся десериализованными, сохраняются и сбрасываются в базу данных. Пока что так хорошо, по крайней мере, до тех пор, пока я не размещаю связанные объекты (ManyToMany).Symfony2 (deserialize): объект обновления (с ассоциацией) с json

У меня есть два объекта (с ассоциацией ManyToMany):

  1. объектов

  2. Элемент

Это работает (см также jsonEditAction в контроллере (размещены ниже)):

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

Мой вопрос: Как я могу редактировать объект с соответствующими субъектами в формате JSON, например:

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

Когда я выкладываю выше JSON я получаю следующее уведомление от Symfony:

"сообщение": "Ожидаемый аргумент типа \" AppBundle \ Entity \ Элемент \ "\ "целое \" дано", "класс": "Symfony \ Component \ PropertyAccess \ Exception \ InvalidArgumentException",

Для получения дополнительной информации; это editAction где Json размещена на:

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

Должен ли я ходить в массив с элементами и найти их один за другим, а затем добавить их в «объект» лица? Или есть «встроенное» решение в сериализаторе, которое я пропустил/не видел?

UPDATE: также JSON, как предложил Алексей не работал:

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

UPDATE: Мой вопрос является дубликатом: Deserialize an entity with a relationship with Symfony Serializer Component Существует запрос выдвижная создан и будут объединены в Symfony 3.2 ...

+0

Может быть, вы ищете Symfony [Data transformer] (http://symfony.com/doc/current/form/data_transformers.html) – Jeet

+0

Но до тех пор, как сериализатор, он должен обрабатывать трансформатор неявно, я использовал [JMSSerializer] (https://github.com/schmittjoh/JMSSerializerBundle) с [FOSRestBundle] (http: // symfony.ком/док/ток/пучки/FOSRestBundle/index.html). Но я никогда не сталкивался с такой проблемой. Это потому, что даже данные были отправлены в чистом JSON, я всегда использовал тип формы для обработки данных сообщения. – Jeet

+0

@Jeet: Можете ли вы показать мне пример вашего обработчика? –

ответ

0

У вас плохой JSON, Symfony говорит вам то же самое.

Хороший JSON может выглядеть следующим образом:

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

Symfony пытается десериализация Element объекта из "1" и "2" в оригинальном формате JSON и выходит из строя.

+0

Привет, Алексей, я написал json, как указано выше, но я все равно получаю ту же ошибку –