如何更改实体的序列化输出?

时间:2018-12-27 04:05:00

标签: symfony symfony4 serializer

$normalizer = new ObjectNormalizer();
//            $normalizer->setCircularReferenceLimit(2);
$normalizer->setCircularReferenceHandler(function ($object) {
    return $object->getId();
});
$normalizer->setIgnoredAttributes(array('users', '__initializer__', '__cloner__', 'authkey', '__isInitialized__', "products"));
$serializer = new Serializer(array($normalizer), array(new JsonEncoder()));

return new JsonResponse($serializer->serialize($product, 'json'));

那是结果:

{
  "id": 128,
  "name": "product",
  "price": 12,
  "category": {
    "id": 58,
    "name": "category",
    "company": {
      "id": 1,
      "name": "foo",
      "tables": []
    }
  },
  "description": "this is a product",
  "company": {
    "id": 1,
    "name": "foo",
    "tables": []
  }
}

但是我如何获得以下结果:

{
  "id": 128,
  "name": "product",
  "price": 12,
  "category": {
    "name": "category"
  },
  "description": "this is a product",
  "company": {
    "id": 1,
    "name": "foo",
    "tables": []
  }
}

如何在两个值之间变化?

例如我要在这里

  

“类别”:{       “ name”:“ category”},

还提供了ID。

1 个答案:

答案 0 :(得分:1)

看看串行器组件Attributes Groups。我相信这就是您想要的。

您可以选择每个特定响应中应包括哪些实体属性。

只需在实体中设置组

/**
 * @Groups({"group1", "group2"})
 */
public $foo;

然后指定要序列化的组或组数组

$serializer = new Serializer(array($normalizer));    
$data = $serializer->normalize($obj, null, array('groups' => 'group1'));

有时仅分组是不够的,也就是说,您可以使用Doctrine hydrator。这是一个稍微复杂的解决方案,但这为您提供了更多的可能性。

通常,当您需要进行简单选择时,将使用Attributes Groups-检索一个特定实体或具有某些已连接实体的实体集合(也可将组用于连接)。 Doctrine hydrator用于需要聚合选择的情况,例如从没有指定关系的表中检索数据,或将组合数据与常规数据一起添加。