嘿,就在一个小时前,我在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函数体内的例子?
任何帮助将不胜感激
所以我会这样做:
$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方法,以防该解决方案不起作用。因为文档仅提供了规范化的示例