【发布时间】: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