Symfony 使用JMSSerializer序列化时的空关系

Symfony 使用JMSSerializer序列化时的空关系,symfony,doctrine-orm,jmsserializerbundle,jms-serializer,Symfony,Doctrine Orm,Jmsserializerbundle,Jms Serializer,我在Symfony项目中编写控制器操作时遇到问题,该操作应返回数据(在本例中为网店订单)。是 啊这是一种REST-API。该路由刚刚从一些JavaScript调用。数据必须在客户端可视化 问题是: 我无法找到相关实体的序列化导致空对象的原因。在本例中,它是订单的用户,订单为空 这是一个示例输出: orders: [ { id: 2, created: '2016-05-04T11:40:27+00:00', user: {}, } ] 当我做这样的事情时 $or

我在Symfony项目中编写控制器操作时遇到问题,该操作应返回数据(在本例中为网店订单)。是 啊这是一种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

我认为您的问题是由延迟加载造成的,也许您可以尝试在订单实体中将用户关联的获取模式更改为“渴望”

@manytone(targetEntity=“Cart”,cascade={“all”},fetch=“EAGER”)

默认情况下,我认为它不会获取关联,除非像这里一样直接调用它

转储($myOrder[0]->getUser()->getUsername())

或者,如果您使用DQL
14.7.6.6. 暂时更改DQL中的获取模式

编辑:我错了 我做了一些测试,在我尝试使用组之前,一切都很好,即使字段是公开的,也不使用默认组,所以它只接受带有“statistics”组的内容 尝试在此处添加默认组

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


或者在您的用户字段中添加统计组,这两个字段都为我工作

您是否在
用户
上设置了
排除策略:all
?是的。但我也有显式的
expose:true
指令。请参阅我关于相关jms实体配置的更新问题。是的,我认为您是对的。这与延迟加载有关。因为我可以控制被序列化的字段。如果我在yml配置中或通过注释设置了一些
exclude:true
,那么
user
字段在我的API响应中根本不存在,这很好。但是它是空的,与延迟加载有关。我不确定,如果急于在数千份订单中表现不佳。难道没有别的办法吗?我不知道为什么,但在我的其他API端点中,序列化关系没有问题。他们都被他们的价值观所填充…好吧,我想我明白了,我做了一些测试,在我尝试使用组之前,所有的东西都可以通过延迟加载或渴望来工作,即使字段是公开的,您也不使用默认组,因此它只接受带有“statistics”组的内容,请尝试在此处添加默认组$serializationContext->setGroups(['Default','statistics']);或者在需要的用户字段上添加统计组。添加“默认”组不是一个选项,因为在这种情况下,它会得到30MB的json:-),但将统计组添加到元数据定义是实现它的方法。不管怎么说,它不起作用。这就是为什么我去掉了整个项目的JMSSerializerBundle。只是做一些重构,这样我就可以使用Symfony/Serializer组件,它现在做得很好。我只是想知道如何实现虚拟财产功能。。。