【问题标题】:Json endpoint circular reference handler HTTP 500 ERRORJson 端点循环引用处理程序 HTTP 500 错误
【发布时间】:2023-10-23 21:24:02
【问题描述】:

我目前正在为对象(票)制作一个 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 错误。 在 dev.log 中,它得到了所有正确的值并且没有显示错误。

我搜索了遮阳篷,但找不到适合此功能的遮阳篷。

服务器返回错误的函数有什么问题? 谢谢!

【问题讨论】:

    标签: json symfony endpoint


    【解决方案1】:

    我认为问题出在这一行:

    $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 上的序列化程序

    【讨论】:

    • 谢谢,我可以将此文档用于循环引用处理程序吗? Symfony documentation
    • 是的!在您的情况下,在 defaultContext 上,而不是返回 return $object->getName(); 返回:return $object->getId();