Symfony 序列化器忽略序列化组

Symfony serializer ignore serialization groups

我有一个来自 Doctrine 存储库的实体,我想将其序列化然后 return 返回。实体当然有几个关系,这些关系也有一些关系,等等。每个需要的关系都已经填充,但不是全部

实体的属性已经有一些序列化组。

public function getListAction(SerializerInterface $serializer)
{
    // ... Getting data from database with Doctrine
    $entities = $this->someRepository->findByConditions(/* ... */);

    $serializer->serialize($entities, 'json');
}

在探查器中,我看到它开始填充其余的关系。开始执行数据库查询以填充所有缺失的属性。然后最终查询超时。

问题: 有没有办法告诉序列化器,序列化给定的对象,但不要填补缺失的关系?也就是说,禁用延迟加载?

添加一个新的序列化组也不行,因为一些Entity有对自身的引用$parent。所以它会再次以执行查询结束。

Serializer 无法查看调用是否会触发 Doctrine 中的延迟加载。您可能可以编写自己的 Normalizer 从 Doctrine 的代理命名空间中查找 类,但我想如果它首先解决您的问题,那可能会变得一团糟。

我能想到的最佳解决方案是在 ORM 级别解决问题,因为这是导致您出现问题的原因。

例如,您可以使用 DQL 或 QueryBuilder 在存储库中创建自定义查找方法,这将获取所有必要的数据,包括可能加入您想要输出的相关对象并排除您不需要的任何字段。然后我会使用不同的水合器水合结果(参见 Doctrine Docs: Hydration)。你可以试试 Doctrine 提供的 SimpleObjectHydrator。据我所知,这个 Hydrator 不会使用代理进行延迟加载,而是会尽可能多地加载它,并且它仍然应该为您提供原始实体,但预加载可能不是您想要的。在这种情况下,您可以将其用作您自己的 Hydrator 的参考。编写自定义水合器可能会非常痛苦,您可以改为选择数组输出并完全放弃对象水合。在那种情况下,您肯定会丢失实体中的注释,然后您需要在序列化程序逻辑中解决这些注释。

您还可以查看本机查询(即 SQL),然后将自定义结果集映射作为备选方案:请参阅 Doctrine Docs: ResultSetMappingBuilder