Json обработчик циклических ссылок конечной точки HTTP 500 ERROR - PullRequest
1 голос
/ 16 марта 2020

В настоящее время я создаю json конечную точку для объектов (билетов).

Это моя функция:

/**
 * @Route("/json/tickets", name="json_tickets")
 */
public function jsonTickets()
{
    $encoders = [new XmlEncoder(), new JsonEncoder()];
    $normalizers = [new ObjectNormalizer()];
    $serializer = new Serializer($normalizers, $encoders);
    $tickets = $this->getDoctrine()->getRepository(Ticket::class)->findAll();

    $jsonObject = $serializer->serialize($tickets, 'json', [
        'circular_reference_handler' => function ($object) {
            return $object->getId();
        }
    ]);

    return new Response($jsonObject);
}

Это сущность для Билетов

    class Ticket
  {
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="tickets")
     */
    private $user;

    /**
     * @ORM\ManyToMany(targetEntity="App\Entity\User", inversedBy="ticket_responsibility")
     */
    private $responsible;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Company", inversedBy="tickets")
     */
    private $company;

    /**
     * @ORM\Column(type="integer")
     */
    private $priority;

    /**
     * @ORM\Column(type="text", nullable=true)
     */
    private $description;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $status;


----------

Эта функция возвращает HTTP 500 ERROR. В dev.log он получает все правильные значения и не показывает ошибок.

Я искал awnsers, но не смог найти правильных awnsers для этой функции.

Что не так в моей функции что сервер возвращает ошибку? Спасибо!

1 Ответ

0 голосов
/ 16 марта 2020

Мне кажется, проблема в этой строке:

$jsonObject = $serializer->serialize($tickets, 'json', [
    'circular_reference_handler' => function ($object) {
        return $object->getId();
    }
]);

Вы уверены, что можете передать список как $tickets в serialize() вместо одного объекта, например $ticket?

Если вам нужно вернуть список объектов, используйте

return $this->json($data, $status = 200, $headers = [], $context = []);

РЕДАКТИРОВАТЬ:

Если вам нужно обработать циклические ссылки, вы можете сделать это, создав класс CircularReferenceHandler.php и зарегистрировать его как сериализатор на framework.yaml

...