如何解决Symfony 序列化器忽略序列化组
我有一个来自 Doctrine 存储库的实体,我想对其进行序列化然后返回。实体当然有几个关系,这些关系也有一些关系,等等。每个需要的关系都已经填充,但不是全部。
实体的属性已经有一些序列化组。
public function getListAction(SerializerInterface $serializer)
{
// ... Getting data from database with Doctrine
$entities = $this->someRepository->findByConditions(/* ... */);
$serializer->serialize($entities,'json');
}
在分析器中,我看到它开始填充其余的关系。开始执行数据库查询以填充所有缺失的属性。然后最终查询超时。
问题: 有没有办法告诉序列化器,仅序列化给定的对象,但不填充缺失的关系?换句话说,禁用延迟加载?
添加新的序列化组也不好,因为某些实体引用了自身 $parent
。所以它会再次执行查询。
解决方法
Serializer 无法查看调用是否会触发 Doctrine 中的延迟加载。您可能可以编写自己的 Normalizer,从 Doctrine 的代理命名空间中查找类,但我想如果它首先解决您的问题,那可能会变得一团糟。
我能想到的最佳解决方案是在 ORM 级别解决问题,因为这就是导致您出现问题的原因。
例如,您可以使用 DQL 或 QueryBuilder 在存储库中创建自定义查找方法,这将获取所有必要的数据,包括可能加入您想要输出的相关对象并排除您不想要的任何字段。然后我会使用不同的 Hydrator 对结果进行保湿(参见 Doctrine Docs: Hydration)。你可以试试 Doctrine 提供的 SimpleObjectHydrator。据我所知,这个 Hydrator 不会使用代理进行延迟加载,而是会尽可能多地加载,它仍然应该为您提供原始实体,但急切加载可能不是您想要的。在这种情况下,您可以将其用作您自己的 Hydrator 的参考。编写自定义 hydrator 可能是一个巨大的痛苦,您可以改为选择数组输出并完全放弃对象水化。在这种情况下,您肯定会丢失实体中的注释,然后您需要在序列化程序逻辑中解决这些注释。
您还可以查看本机查询(即 SQL),然后将自定义结果集映射作为替代方案:参见 Doctrine Docs: ResultSetMappingBuilder
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。