doctrine-orm - 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)
我是正确使用序列化程序还是我的模型配置不正确?
解决方案
您对您的关系有一个循环引用。我猜ProjectItem有一个引用Project的字段项目,这会导致序列化程序出现循环。您可以忽略所述属性以防止这种情况发生。查看序列化程序文档中被忽略的属性部分。
另一种选择是使用序列化组。每个属性都会获得一个 Group 注释,例如@Groups("group1")
将引用属性排除回Project。然后,您将告诉序列化程序序列化该组:
$json = $serializer->serialize(
$itemList,
'json', ['groups' => 'group1']
);
您还可以查看JMS Serializer,它添加了 @Exclude 和 @Include注释以使这一步更容易一些。
推荐阅读
- html - 如何替换 mailchimp CSS 嵌入代码中的按钮样式?
- discord.py - discord.ext.commands 如何在 Cog 中工作?
- flutter - 如何让 iOS 上的 Workmanager 颤动
- javascript - 带有简单matter.js的双鼠标光标
- go - 识别存储在 go 接口中的实际类型
- python - 用 QThread 改变 QTextBrowser
- php - 如何在超薄框架上修复错误“找不到类 'App\\Db\\Database'”
- java - 检查一个值的变化是否超过 10^-3?
- javascript - 计算属性和 Vue 组件
- javascript - window.onscroll css transformY 过渡闪烁