Json 终结点循环引用处理程序 HTTP 500 错误
Json endpoint circular reference handler HTTP 500 ERROR
我目前正在为对象(票证)制作一个 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;
----------
此函数 returns HTTP 500 错误。
在 dev.log 中,它获得了所有正确的值并且没有显示错误。
我搜索了遮阳篷,但找不到适合此功能的遮阳篷。
服务器returns出错是我的函数有什么问题?
谢谢!
我认为问题出在这一行:
$jsonObject = $serializer->serialize($tickets, 'json', [
'circular_reference_handler' => function ($object) {
return $object->getId();
}
]);
您确定可以将列表作为 $tickets
传递给 serialize()
而不是像 $ticket
这样的单个对象吗?
如果您必须 return 对象列表,请使用
return $this->json($data, $status = 200, $headers = [], $context = []);
编辑:
如果您需要处理循环引用,您可以创建一个 CircularReferenceHandler.php
class 并将其注册为 framework.yaml
上的序列化程序
我目前正在为对象(票证)制作一个 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;
----------
此函数 returns HTTP 500 错误。 在 dev.log 中,它获得了所有正确的值并且没有显示错误。
我搜索了遮阳篷,但找不到适合此功能的遮阳篷。
服务器returns出错是我的函数有什么问题? 谢谢!
我认为问题出在这一行:
$jsonObject = $serializer->serialize($tickets, 'json', [
'circular_reference_handler' => function ($object) {
return $object->getId();
}
]);
您确定可以将列表作为 $tickets
传递给 serialize()
而不是像 $ticket
这样的单个对象吗?
如果您必须 return 对象列表,请使用
return $this->json($data, $status = 200, $headers = [], $context = []);
编辑:
如果您需要处理循环引用,您可以创建一个 CircularReferenceHandler.php
class 并将其注册为 framework.yaml