Symfony - ManyToOne 关系中的循环引用错误

问题描述 投票:0回答:2

我正在使用 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"

你知道我该如何解决吗?

symfony doctrine
2个回答
5
投票

$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']
        ]
    );

0
投票

这些步骤帮助我修复了 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 选项中,我们定义哪些实体的字段不应包含在输出中。

© www.soinside.com 2019 - 2024. All rights reserved.