【问题标题】:Symfony Seralizer doesn't serialize OneToOne relation / Doctrin ProxySymfony 序列化器不序列化一对一关系/ Doctrine Proxy
【发布时间】:2020-09-15 14:44:49
【问题描述】:

我正在尝试序列化与图像实体具有 OneToOne 关系的实体。 转储实体时,我可以看到图像实体是 Doctrine Proxy 并且未初始化。

在尝试访问 Endpoint 时,它也不会显示在 JSON 响应中。 我试过 fetch="EAGER" 没有成功。

如何将其序列化为“预期响应”?

回复:

[
  {
    "id": 7
  }
]

预期响应:

[
  {
    "id": 7,
    "image": {
        "webView": "someUrl"
    }
  }
]

实体:

/**
 * @ORM\Entity(repositoryClass=BatteryTypeRepository::class)
 */
class BatteryType
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     *
     * @Groups({"type"})
     */
    private $id;

    /**
     * @ORM\OneToOne(targetEntity=Image::class, cascade={"persist", "remove"})
     *
     * @Groups({"type"})
     */
    private $image;

    /**
     * @return Image|null
     */
    public function getImage(): ?Image
    {
        return $this->image;
    }

    public function setImage(?Image $image): self
    {
        $this->image = $image;

        return $this;
    }
}

图像实体:

/**
 * @ORM\Entity(repositoryClass=ImageRepository::class)
 * @ORM\EntityListeners({"App\EventSubscriber\ImageListener"})
 */
class Image
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     * @Groups({"type"})
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $filename;

    /**
     * Auto generated by entity listener
     * @var string
     */
    private $tempFilename;

    /**
     * @var File
     * @Assert\Image()
     * @Assert\NotBlank()
     */
    private $file;

    /**
     * @var string
     * @Groups({"type"})
     */
    private $webView;

    /** Getters & Setters */
}

图像监听器:

class ImageListener
{
    /**
     * @var S3FileManagerInterface
     */
    private S3FileManagerInterface $fileManager;

    public function __construct(S3FileManagerInterface $fileManager)
    {
        $this->fileManager = $fileManager;
    }

    public function postLoad(Image $image, LifecycleEventArgs $args): void
    {
        $image->setWebView(
            $this->fileManager->getUrl($image->getFilename())
        );

        if (!$image->getTempFilename()) {
            $image->setTempFilename($image->getFilename());
        }
    }
}

控制器:

    public function getBatteryTypes(BatteryTypeRepository $batteryTypeRepository): Response
    {
        $batteryTypes = $batteryTypeRepository->findAll();
        $view = $this->view($batteryTypes, Response::HTTP_OK);
        $view->getContext()->setGroups(["type"]);

        return $this->handleView($view);
    }

【问题讨论】:

  • 考虑创建一个 DQL 查询并选择 Battery 和 Image 实体。这将完全消除代理,并至少缩小任何剩余的问题。

标签: php symfony serialization doctrine


【解决方案1】:

在您的Image 实体中,您必须为webView 属性添加@Groups({"type"}) 注释。

【讨论】:

  • 我用图像实体源调整了我的帖子
  • 注解是否正确导入Image? (只是想消除这种可能性)
【解决方案2】:

我的问题显然只是缓存相关

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    • 2015-08-13
    • 2011-08-11
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多