3

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

使用上下文的“circular_reference_handler”键代替 symfony 4.2

该问题的答案将我引向一个新问题,即达到的最大嵌套级别。

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

没有提到这个上下文键或如何实现它。

如果我使用上一个问题的 circular_reference_handler 的示例,我将在 framework.yaml 文件中添加上下文键:

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

并创建类

namespace App\Serializer;


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

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

$this->serializer->serialize($object, 'json', ['enable_max_depth' => true]);

现在我的问题是我该如何处理?有没有人举个例子说明在这个 __invoke 函数的主体中应该放什么?

任何帮助将不胜感激

4

1 回答 1

1

所以我会这样做:

<?php

use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;

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

关于 __invoke 里面的代码,其实你可以返回任何你需要的数据。例如只返回相关对象的 id。在某些情况下对输出 json 很有用你需要像这样更新你的 __invoke 方法:

<?php

namespace App\Serializer;

class MyMaxDepthHandler
{
    public function __invoke($innerObject, $outerObject, string $attributeName, string $format = null, array $context = []){
        return $innerObject->id;
    }
}

您可以在文档的处理序列化深度部分找到详细说明

我猜当您调用serialize方法时,Serializer 会在内部调用normalize结束,但请仔细检查它。如果不是这种情况,可以直接调用normalize方法,以防此解决方案不起作用。因为文档只提供了一个带有normalize的示例

于 2019-02-12T13:28:08.820 回答