首页 > 解决方案 > Symfony4 返回序列化的 json 响应

问题描述

我正在查看一个新的 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;

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

然后我有一个控制器,我试图返回一个 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)

我是正确使用序列化程序还是我的模型配置不正确?

标签: doctrine-ormsymfony4symfony5

解决方案


您对您的关系有一个循环引用。我猜ProjectItem有一个引用Project的字段项目,这会导致序列化程序出现循环。您可以忽略所述属性以防止这种情况发生。查看序列化程序文档中被忽略的属性部分。

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

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

您还可以查看JMS Serializer,它添加了 @Exclude 和 @Include注释以使这一步更容易一些。


推荐阅读