symfony - 具有多对多关系的 Symfony 5 对象序列化超时
问题描述
在我的 Symfony 5 应用程序中,我有一个实体类Product
,它有两个属性$categories
和$bundles
. 产品类与这两个属性都具有多对多关系。当我注释掉任一属性时,产品序列化工作完美。但是如果两个属性都存在,则序列化超时。
Product 类的代码摘录。
class Product
{
/**
* @ORM\ManyToMany(targetEntity=ProductBundle::class, mappedBy="products")
*/
private $productBundles;
/**
* @ORM\ManyToMany(targetEntity=Category::class, mappedBy="products")
* @MaxDepth(1)
*/
private $categories;
}
序列化代码如下。
$products = $productRepository->findBySearchQuery($name);
$productsJson = $serializerInterface->serialize($products, 'json', [
ObjectNormalizer::CIRCULAR_REFERENCE_HANDLER => function ($object) {
return $object->getId();
}
]);
我尝试使用在其他一些 Stackoverflow 答案和 @MaxDepth 上建议的 @ORM/JoinTable 注释,但没有运气。如果任何属性被注释掉,代码就可以工作。对此有任何建议将不胜感激。
解决方案
好吧,20个产品其实并不多。所以我猜如果你让关系不受阻碍地序列化,你会一遍又一遍地输出相同的对象。
我实际上不知道如何使用序列化程序可靠地实现这一点。但是标准的方法可能就足够了。我喜欢通过这样JsonSerializable
的实体上的接口进行序列化(为简洁起见,省略 ORM 内容):
class Product implements \JsonSerializable {
public $name;
public $categories; // relation
// getters + setters omitted
// this implements \JsonSerializable
public function jsonSerialize() {
return [
'name' => $this->name,
'categories' => array_map(function($category) {
return $category->jsonSerializeChild();
}, $this->categories),
];
}
// this function effectively stops recursion by leaving out relations
public function jsonSerializeChild() {
return [
'name' => $this->name,
];
}
}
如果您在所有实体上实现此功能,您可以非常有效地将序列化深度限制为两个(即“基础”实体及其连接的实体)。
此外,如果序列化为JSON ,则 symfony 序列化程序将使用 JsonSerializable 接口,如果它已定义。显然,这不像一些花哨的基于注释的序列化或“智能”序列化器那样优雅,实际上可以停止......但它可能会更好......
推荐阅读
- python - 如何在 postgresql 数据库中导入 geojson 文件?
- javascript - 当为父母和孩子使用单独的点击事件时,它会影响下一个元素
- python - 嵌套文件读取不会遍历所有主循环
- javascript - 在使用 Jest 进行测试之前等待 React 组件状态更新
- python-3.x - 使用 Python 包连接到 Google Cloud 上的 Windows 虚拟机
- c# - SQL Server 和 Visual Studio:如何应对不同的 Microsoft.SqlServer.Types 版本
- java - 公开单个 REST 端点 (GET),它返回一个父对象和与之关联的所有子对象
- c++ - OpenSSL 偶尔会打印随机垃圾
- java - 给定n个包含整数的链表,找到它们之间的共同元素并返回列表
- python - 删除python列表中的重复元素