使用JMSSerializer序列化时的空关系

时间:2018-05-03 21:34:36

标签: symfony doctrine-orm jmsserializerbundle jms-serializer

我在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

1 个答案:

答案 0 :(得分:0)

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

  

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

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

  

转储($ 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

编辑:我错了 我做了一些测试,所有工作都很好,延迟加载或渴望直到我尝试使用组,即使字段暴露你不使用默认组,所以它只采取与'统计'组的东西 尝试在此处添加默认组

  

$ serializationContext-> setGroups([ '缺省', '统计']);

或者在您为我工作的用户字段中添加统计组