我的问题很简单,但我在网上搜索了一个小时后没有找到任何线索。我正在尝试构建一个 Symfony API,但是当返回 json 输出时,它会延迟加载输出中的每个关系。虽然这不是什么大问题(在大多数情况下),但当它对用户信息执行此操作时,情况确实很糟糕。因此,所有内容(密码、电子邮件等)都会显示出来。我的问题是:是否可以在学说中将一个实体标记为受保护,这样就不会使用该实体进行自动加载?在某些情况下它非常方便,但这是一个很大的缺陷。如果无法标记实体,是否可以完全停用它或在集合元素上停用它?提前致谢编辑:class User implements UserInterface{ /** * @ORM\Id() * @ORM\GeneratedValue() * @ORM\Column(type="integer") */ private $id; /** * @ORM\Column(type="string", length=180, unique=true) */ private $email; /** * @var string The hashed password * @ORM\Column(type="string") */ private $password; /** * @ORM\OneToOne(targetEntity="App\Entity\Profile", mappedBy="user", cascade={"persist", "remove"}) */ private $profile;getter 和 setter 都在那里。还有一个 Profile 类,即所有关系的接口。它具有 1to1 的关系。class Profile{ /** * @ORM\Id() * @ORM\GeneratedValue() * @ORM\Column(type="integer") */ private $id; /** * @ORM\OneToOne(targetEntity="App\Entity\User", inversedBy="profile", cascade={"persist", "remove"}) * @ORM\JoinColumn(nullable=false) */ private $user;getter 和 setter 就在那里。class Event{ /** * @ORM\Id() * @ORM\GeneratedValue() * @ORM\Column(type="integer") */ private $id; /** * @ORM\Column(type="datetime") */ private $date; /** * @ORM\ManyToOne(targetEntity="App\Entity\Profile", inversedBy="ownedEvents") * @ORM\JoinColumn(nullable=false) */ private $profile; /** * @ORM\OneToMany(targetEntity=Post::class, mappedBy="event", orphanRemoval=true) */ private $posts;问题是,该配置文件已加载,用户也可以使用它......以下是控制器功能。但序列化是在额外的方法中进行的。public function getUnreactedEvents(): JsonResponse{ $events = $this->getDoctrine() ->getManager() ->getRepository(Event::class) ->getUnreactedEvents($this->profileUtils->getLoggedInProfileFromDatabase()->getId()); return new JsonResponse($this->eventUtils->eventsToArray($events)); }
1 回答
守着一只汪
TA贡献1872条经验 获得超3个赞
我建议使用JMSSerializerBundle来实现这一点。它是一个广泛使用的捆绑包,也有大量的 API。您可以准确配置哪些属性应该公开,哪些不应该公开。您还可以构建用于公开属性的组并使用特定的排除策略。
提示:还要检查深层嵌套对象的限制序列化深度。
- 1 回答
- 0 关注
- 115 浏览
添加回答
举报
0/150
提交
取消