使用 JMSSerializer 序列化时的空关系

Empty relations when serializing with JMSSerializer

我在 Symfony 项目中编写控制器动作时遇到问题,应该 return 数据(在这种特殊情况下是网上商店的订单)。是的……这是一种 REST-API。这条路线刚刚被一些 JavaScript 调用。并且数据必须在客户端可视化。

问题:

我无法找出为什么相关实体的序列化会导致空对象。本例为订单用户,为空

这是示例输出:

orders: [
  {
    id: 2,
    created: '2016-05-04T11:40:27+00:00',
    user: {},
  }
]

当我做类似

的事情时
$orders = $this->getDoctrine()->getRepository('AppBundle:Order')
  ->findAllCompleted();

$serializationContext->setSerializeNull(true);
$serializationContext->setGroups(['statistics']);

$json = $serializer->serialize($orders, 'json', $serializationContext);
$response = new Response($json, $statusCode, [
  'Content-Type' => 'application/json',
]);

return $response;

...我从服务器得到一个很好的 JSON 响应,但是每个订单的每个相关实体,比如 user{}(空)。

即使我像这样在序列化之前转储相关实体:

[...]
$myOrder = array_filter($orders, function($order) {
  if ($order->getId() == 2) {
    return true;
  }
  return false;
});

dump($myOrder[0]->getUser());
die();

...它会产生一个空的(未水合的)实体。

但是如果我把这个调试代码改成:

$myOrder = array_filter($orders, function($order) {
  if ($order->getId() == 2) {
    return true;
  }
  return false;
});

dump($myOrder[0]->getUser()->getUsername());
die();

...我得到一个清晰的输出(字符串),其中包含该实体的用户名值。

所以我认为问题出在非水合实体上,而不是序列化程序或其错误配置。

如何让 JMSSerializer 处理那些相关实体的水合作用?

我没有在文档中找到任何提示...

顺便说一句,这是订单和用户的 JMS 实体配置。

AppBundle\Entity\User:
  exclusion_policy: ALL
  properties:
    userMeta:
      expose: true
    address:
      expose: true
    username:
      expose: true
    email:
      expose: true
    isReseller:
      expose: true
    acceptPublicOrders:
      expose: true
    vatNumber:
      expose: true
    taxRate:
      expose: true


AppBundle\Entity\Order:
  exclusion_policy: NONE
  properties:
    id:
      groups: ['statistics']

    user:
      groups: ['statistics']

    configuration:
      groups: ['statistics']

    created:
      groups: ['statistics']

    invoiceItems:
      groups: ['statistics']
      exclude: true

我认为你的问题是由学说延迟加载引起的也许你可以尝试在你的订单实体中将用户关联的获取模式更改为 EAGER

@ManyToOne(targetEntity="Cart", cascade={"all"}, fetch="EAGER")

默认情况下,我认为它不会获取关联,除非您像此处那样直接调用它

dump($myOrder[0]->getUser()->getUsername());

https://www.doctrine-project.org/projects/doctrine-orm/en/latest/reference/annotations-reference.html#annref-onetoone

或者如果你使用 DQL
14.7.6.6。临时更改 DQL 中的提取模式

http://doctrine-orm.readthedocs.io/en/latest/reference/dql-doctrine-query-language.html#temporarily-change-fetch-mode-in-dql

编辑:我错了 我做了一些测试,在延迟加载或急切的情况下一切正常,直到我尝试使用组,即使字段公开你不使用默认组所以它只接受带有 'statistics' 组的东西 尝试在此处添加默认组

$serializationContext->setGroups(['Default','statistics']);

或者在你的用户字段上添加统计组对我都有效