使用SerializerInterface修复symfony中的循环引用

时间:2018-07-13 14:52:32

标签: symfony serialization doctrine-orm doctrine symfony4

序列化组件时出现循环引用错误。通常可以使用

解决此问题
$normalizer->setCircularReferenceHandler()

但是,我正在像这样使用SerializerInterface:

/**
  * @Route("/get/{id}", name="get_order_by_id", methods="GET")
  */
 public function getOrderById(SerializerInterface $serializer, OrderRepository $orderRepository, $id): Response
 {
   return new Response($serializer->serialize(
     $orderRepository->find($id),
     'json',
     array('groups' => array('default')))
   );
  }

使用此接口进行序列化时是否可以解决循环引用错误?

2 个答案:

答案 0 :(得分:3)

您完全可以。只需将其添加到您的框架配置中即可。

framework:
    serializer:
        circular_reference_handler: App\Serializer\MyCustomCircularReferenceHandler

此处理程序将在全局工作。确保将其注册为服务。我不需要实现任何接口。因此,仅带有__invoke()的类就足够了。该调用将接收被“循环引用”的对象作为唯一参数。

您可以返回ID或做一些非常酷的事情,例如为资源创建一个uri。但是实现细节完全取决于您,只要您不返回同一对象,一切都会好起来的。

:)

答案 1 :(得分:0)

根据界面上的Symfony API Reference,似乎没有执行该功能或检索规范化器的方法。

即使在Serializer中,似乎也没有办法在创建序列化程序后检索规范化器。

最好不要在序列化程序之前创建标准化程序来实现此目的,而不要通过配置文件注入接口。 (Relevant docs link