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

问题描述 投票:2回答:1

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

(Qazxswpoi)

这个问题的答案让我想到了达到最大嵌套水平的新问题。

在文档中(use the "circular_reference_handler" key of the context instead symfony 4.2

没有提到此上下文密钥或如何实现它。

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

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

并创建类

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

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

namespace App\Serializer;


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

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

任何帮助将不胜感激

symfony serializer symfony-4.2
1个回答
0
投票

所以我会这样做:

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

关于__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()]);

您可以在文档的<?php namespace App\Serializer; class MyMaxDepthHandler { public function __invoke($innerObject, $outerObject, string $attributeName, string $format = null, array $context = []){ return $innerObject->id; } } 部分找到详细说明

我猜测串行器在调用serialize方法时调用normalize结束,但仔细检查一下。如果不是这种情况,可以直接调用normalize方法,以防该解决方案不起作用。因为文档仅提供了规范化的示例

© www.soinside.com 2019 - 2024. All rights reserved.