Symfony 4 返回序列化 json 响应

Symfony4 returning serialized json repsonse

我正在查看一个新的 Symfony5 项目,我正在尝试 return 一些数据的 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;

我有一个项目,可以有很多项目项

然后我有一个控制器,我正在尝试 return 一个 json 响应:

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

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

    return new Response($items, 200);
}

目前return出现错误:

A circular reference has been detected when serializing the object of class "App\Entity\Project" (configured limit: 1)

我是否正确使用了序列化器,或者我的模型配置不正确?

你对你的关系有一个循环引用。我猜 ProjectItem 有一个引用 Project 的字段 project 会导致序列化程序循环。您可以忽略该属性以防止这种情况发生。查看序列化程序文档的 ignored attributes 部分。

另一种选择是使用 Serialization Groups。每个 属性 都会得到一个组注释,例如 @Groups("group1") 排除引用 属性 回到 Project。 然后您将告诉序列化程序序列化该组:

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

您也可以查看 JMS Serializer which adds @Exclude and @Include annotations 以简化此步骤。

只需使用json_encode:

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

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

或使用 JsonResponse class:

return new JsonResponse($itemsList);