Symfony 使用JMSSerializer序列化时的空关系
我在Symfony项目中编写控制器操作时遇到问题,该操作应返回数据(在本例中为网店订单)。是 啊这是一种REST-API。该路由刚刚从一些JavaScript调用。数据必须在客户端可视化 问题是: 我无法找到相关实体的序列化导致空对象的原因。在本例中,它是订单的用户,订单为空 这是一个示例输出: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
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组件,它现在做得很好。我只是想知道如何实现虚拟财产功能。。。