Я получил сериализатор в Symfony работает, я могу получить и POST JSON с EntityController. У меня есть форма редактирования, где существующий объект / объект может быть отредактирован и сохранен. Когда отредактированный объект публикуется (как объект json), объекты json десериализуются, сохраняются и сбрасываются в базу данных. Пока все хорошо, по крайней мере, до тех пор, пока я не публикую связанные сущности (ManyToMany).
У меня есть две организации (с ассоциацией ManyToMany):
объект
Элемент
Это работает (см. Также jsonEditAction в контроллере (опубликовано ниже)):
{
"id": "1",
"name": "object 1"}
Мой вопрос: как я могу отредактировать объект со связанными объектами в json, например так:
{
"id": "1",
"name": "object 1",
"elements": {
"0": "1",
"1": "2"}
}
Когда я публикую вышеупомянутый json, я получаю следующее уведомление от Symfony:
«message»: «Ожидаемый аргумент типа \» AppBundle \ Entity \ Element \ «, \» integer \ «данное»,
«class»: «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;
} `
Должен ли я перейти к массиву с элементами и найти их один за другим, а затем добавить их к объекту «объект»? Или в сериализаторе есть встроенное решение, которое я пропустил / не увидел?
ОБНОВИТЬ:
Также JSON, подобный предложенному Алексеем, не работал:
{
"id": 2,
"name": "Object 2c",
"elements": [{
"id": 1
}, {
"id": 2
}]
}
ОБНОВИТЬ:
Мой вопрос является дубликатом:
Десериализовать объект, связанный с Symfony Serializer Component
Создан пулл-запрос, который будет объединен в Symfony 3.2 …
У вас плохой JSON, Symfony говорит вам то же самое.
Хороший JSON может выглядеть так:
{
"id": "1",
"name": "object 1",
"elements": [
{"id": "254", "name": "element 254"},
{"id": "301", "name": "element 301"}
]
}
Symfony пытается десериализовать Element
объект из "1"
а также "2"
в вашем оригинальном JSON и не удается.
Других решений пока нет …