我正在使用 Symfony 5 和原则。我有两个具有 ManyToOne 关系的实体(
Product
和 ProductImage
)。每个产品可以有多个图像,并且产品实体有 getProductImages()
方法来获取其产品图像。
但是当我在控制器响应中使用此方法时,如下所示:
return $this->json($product->getProductImages());
我收到以下错误:
A circular reference has been detected when serializing the object of class "App\Entity\Product"
你知道我该如何解决吗?
$this->json()
使用序列化器将 ProductImage 转换为 json。当序列化程序尝试序列化 ProductImage 时,它会找到对其 Product 的引用并尝试对其进行序列化。然后,当它序列化 Product 时,它会发现对 ProductImage 的引用,这会导致错误。
如果您不需要 json 中的 Product 信息,解决方案是定义序列化组并跳过导致错误的 Product 属性的序列化。
将 use 语句添加到您的 ProductImage 类中:
use Symfony\Component\Serializer\Annotation\Groups;
向要序列化的属性添加一个组,但跳过 Product 属性:
/**
* @Groups("main")
*/
private $id;
/**
* @Groups("main")
*/
private $filename;
并在控制器中指定要在
$this->json()
中使用的组:
return $this->json(
$product->getProductImages(),
200,
[],
[
'groups' => ['main']
]
);
这些步骤帮助我修复了 Symfony 中的循环错误。
创建文件
src/Serializer/CircularReferenceHandler.php
,如果发生错误,我们尝试仅获取实体对象的id
字段:
namespace App\Serializer;
class CircularReferenceHandler
{
public function __invoke($object)
{
return $object->getId();
}
}
修改
config/services.yaml
为 defaultContext
参数定义 circular_reference_handler选项:
services:
app.normalizer.object_normalizer:
class: Symfony\Component\Serializer\Normalizer\ObjectNormalizer
tags: ['serializer.normalizer']
arguments:
$defaultContext:
circular_reference_handler: '@App\Serializer\CircularReferenceHandler'
ignored_attributes: ['createdAt', 'updatedAt']
在 ignored_attributes 选项中,我们定义哪些实体的字段不应包含在输出中。