symfony 4.2 max_depth_handler序列化器如何实现?

时间:2019-02-12 09:28:56

标签: symfony serializer symfony-4.2

嘿,就在一个小时前,我问了一个关于symfony 4.2的序列化程序中新的circle_reference_handler的问题。

use the "circular_reference_handler" key of the context instead symfony 4.2

这个问题的答案使我想到了一个达到最大嵌套级别的新问题。

在文档(https://symfony.com/doc/current/components/serializer.html#handling-serialization-depth

没有提及此上下文密钥或其实现方式。

如果我使用上一个问题的circle_reference_handler的示例,则将上下文密钥添加到framework.yaml文件中的以下位置:

our_list <- list(
  data.frame(
    NAME = 1:4, 
    TIME = c(20L, 30L, 15L, 12L), 
    AMOUNT = c(456L,-234L, -13L, 267L)
  ),
  data.frame(
    NAME = 1:4, 
    TIME = c(20L, 30L, 15L, 12L), 
    AMOUNT = c(-6L, 23L, -13L, -26L)
  )
)

并创建类

framework:
  serializer:
    max_depth_handler: 'App\Serializer\MyMaxDepthHandler'

为了使序列化程序使用此处理程序,我为序列化函数设置了上下文:

namespace App\Serializer;


class MyMaxDepthHandler
    {
    public function __invoke($object){
        //TODO how to handle this
    }
}

现在我的问题是我该如何处理?有人在这个__invoke函数的主体中放一个例子吗?

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

所以我只需这样做:

<p>product: (<%= (int)request.getParameter("val1") %> * <%= (int)request.getParameter("val2") %>)</p>

关于__invoke内部的代码,您可以返回实际上需要的任何数据。例如,只需返回相关对象的ID。在某些情况下对输出json有用 并且您需要像这样更新__invoke方法:

<?php

use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;

$this->serializer->serialize($object, 'json', [ObjectNormalizer::ENABLE_MAX_DEPTH => true, ObjectNormalizer::MAX_DEPTH_HANDLER => new MyMaxDepthHandler()]);

您可以在文档的Handling Serialization Depth部分中找到详细的说明

我猜想序列化程序会在调用 serialize 方法时在内部调用 normalize 来结束,但请仔细检查一下。如果不是这种情况,可以在此解决方案不起作用的情况下直接调用 normalize 方法。因为该文档仅提供 normalize

的示例