Symfony4 вернул сериализованный json ответ - PullRequest
0 голосов
/ 10 января 2020

Я смотрю на новый проект Symfony5, где пытаюсь вернуть JSON ответ некоторых данных.

У меня есть Project и ProjectItem

У меня есть следующее:

// Project.php

/**
 * @ORM\OneToMany(targetEntity="App\Entity\ProjectItem", mappedBy="project")
 */
private $projectItems;


// ProjectItem.php

/**
 * @ORM\ManyToOne(targetEntity="App\Entity\Project", inversedBy="projectItems")
 */
private $project;

У меня есть один проект, у которого может быть много ProjectItems

У меня есть контроллер, который я пытаюсь вернуть ответ json:

public function index()
{
    $itemsList = $this->getDoctrine()
        ->getRepository(Project::class)
        ->findAll();

    $items = $this->get('serializer')->serialize($itemsList, 'json');

    return new Response($items, 200);
}

В настоящее время возвращается ошибка:

При сериализации объекта класса "App \ Entity \ Project" обнаружена циклическая ссылка (настроенное ограничение: 1)

Правильно ли я использую сериализатор или неправильно настроены мои модели?

Ответы [ 2 ]

1 голос
/ 14 января 2020

Просто используйте json_encode:

public function index()
{
    $itemsList = $this->getDoctrine()
    ->getRepository(Project::class)
    ->findAll();

    return new Response(
        json_encode($itemsList), 
        200
    );
}

или используйте класс JsonResponse:

return new JsonResponse($itemsList);
0 голосов
/ 10 января 2020

У вас есть круговая ссылка с вашими отношениями. Я предполагаю, что ProjectItem имеет поле project , которое ссылается на Project , что вызывает al oop для сериализатора. Вы можете игнорировать указанный атрибут, чтобы предотвратить это. Извлеките раздел игнорируемые атрибуты документации по сериализатору.

Другой вариант - использовать Группы сериализации . Каждое свойство получит аннотацию группы, например, @Groups("group1"), исключая это ссылочное свойство обратно в Project . Затем вы должны указать сериализатору сериализовать эту группу:

$json = $serializer->serialize(
    $itemList,
    'json', ['groups' => 'group1']
);

Вы также можете оформить Сериализатор JMS , который добавляет @Exclude и @Include аннотации , чтобы сделать этот шаг немного проще.

...