当前位置: 首页 > 知识库问答 >
问题:

Symfony 4.2自定义循环引用处理程序不适用

姬俊能
2023-03-14

上下文是我一直在尝试为我的实体设置一个自定义循环引用处理程序,它将影响所有实体。

根据文件(https://symfony.com/doc/current/components/serializer.html#handling-循环引用),我们被引导在config/packages/framework.yaml文件中的serializer服务下设置circular\u reference\u handler值:

framework:
    validation:
        enabled: true

    messenger:
        enabled: true

    assets:
        enabled: true

    serializer:
        circular_reference_handler: App\Services\CircularReferenceHandler
        enable_annotations: true

我的实际问题是,当序列化程序尝试加载循环引用处理程序时,我的覆盖似乎不存在:显示键引用的图像显示上下文为空

为什么我的超驰装置根本没有应用到上下文中??

我试图:

他们都没有工作

我给你看了我的yaml,但这里是处理程序:

<?php

namespace App\Services;

class CircularReferenceHandler
{
    /**
     * @param object $object
     * @return mixed
     */
    public function __invoke($object)
    {
        return $object->getId();
    }
}

下面是我试图作为替代使用的上下文生成器:

<?php

namespace App\Serializer;

use ApiPlatform\Core\Serializer\SerializerContextBuilderInterface;
use App\Services\CircularReferenceHandler;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;

final class GlobalSerializerContextBuilder implements SerializerContextBuilderInterface
{
    /**
     * Creates a serialization context from a Request.
     *
     * @param Request    $request
     * @param bool       $normalization
     * @param array|null $extractedAttributes
     *
     * @return array
     */
    public function createFromRequest(Request $request, bool $normalization, array $extractedAttributes = null): array
    {
        $resourceClass = $context['resource_class'] ?? null;

        $context[AbstractNormalizer::CIRCULAR_REFERENCE_HANDLER] = CircularReferenceHandler::class;

        return $context;
    }
}

这是我注册的地方(医生):

    App\Serializer\GlobalSerializerContextBuilder:
        decorates: 'api_platform.serializer.context_builder'
        arguments: ['@App\Serializer\GlobalSerializerContextBuilder.inner']
        autoconfigure: false

我希望在AbstractNormalizer-


共有1个答案

公孙联
2023-03-14

所以我发现我在使用规范化策略时一定犯了一个错误。本质上,如果要全局更改序列化程序$context(SerializerInterface中的第三个参数-

这是我最后一堂课:

<?php
namespace App\Serializer;

use App\Services\CircularReferenceHandler;
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;

/**
 * Class ApiNormalizer. Acts as an entrypoint to GLOBALLY alter context for all denormalizers and normalizers ( and subsequenty the serializers ).
 * @package App\Serializer
 */
final class ApiNormalizer implements NormalizerInterface, DenormalizerInterface
{
    private $normalizer;

    public function __construct(NormalizerInterface $normalizer)
    {
        if (!$normalizer instanceof DenormalizerInterface) {
            throw new \InvalidArgumentException('The normalizer must implement the DenormalizerInterface');
        }

        $this->normalizer = $normalizer;
    }

    public function denormalize($data, $class, $format = null, array $context = [])
    {
        return $this->normalizer->denormalize($data, $class, $format, $context);
    }

    public function supportsDenormalization($data, $type, $format = null)
    {
        return $this->normalizer->supportsDenormalization($data, $type, $format);
    }

    public function normalize($object, $format = null, array $context = [])
    {
        $context[AbstractNormalizer::CIRCULAR_REFERENCE_HANDLER] = CircularReferenceHandler::class;
        $context['enable_max_depth'] = true;

        return $this->normalizer->normalize($object, $format, $context);
    }

    public function supportsNormalization($data, $format = null)
    {
        return $this->normalizer->supportsNormalization($data, $format);
    }
}

要查看的方法就是normalize()。到目前为止,这是我唯一需要进行更改的地方,接口要求我至少去掉其余的方法,以便您可以忽略其他方法。但是,现在我有了一个地方,可以在需要时全局更改序列化上下文的数据或状态。

希望这对其他人有帮助。

 类似资料:
  • 可以通过实现接口或扩展任何现有的实现来创建自己的自定义处理程序。 在下面的示例中,我们通过扩展类创建了自定义处理程序。 为了理解上述与DBUtils相关的概念,让我们编写一个将运行读取查询的示例。 创建一个示例应用程序。 更新在DBUtils入门程序中创建的文件:MainApp.java。 按照下面的说明编译并运行应用程序。 以下是的内容。 以下是文件的内容。 以下是文件的内容。 完成创建源文件后

  • 我们可以通过实现ResultSetHandler接口或扩展ResultSetHandler的任何现有实现来创建我们自己的自定义处理程序。 在下面给出的示例中,我们通过扩展BeanHandler类创建了一个自定义处理程序EmployeeHandler。 要理解与DBUtils相关的上述概念,让我们编写一个运行读取查询的示例。 要编写我们的示例,让我们创建一个示例应用程序。 步 描述 1 更新在 DB

  • 问题内容: 谁能给我一个创建事件和处理程序的自定义集的示例。假设您有一个Person对象,您希望小部件知道它是否已更新。 您创建了一个HandlerManager,现在您必须创建一个Event和一个Handler。您将如何定义这些类,以便可以订阅和引发事件? 大多数事件都是基于DOM的,而我想创建一些自定义事件和处理程序,这些事件和处理程序可以在任何基于浏览器的事件之外触发。 问题答案: 这是一个

  • 有一个名为Avro-Tools的工具,它随Avro一起提供,可以用来在JSON、Avro-Schema(.avsc)和二进制格式之间进行转换。但它不能用于循环引用。 我们有两个文件: > 循环.avsc(由Avro生成) json(由jackson生成,因为它有循环引用,Avro不喜欢这样)。 通告.AVSC circular.json 在上面运行avro-tools的命令 Java-jar av

  • 下面是我的父组件,它包含一个循环的多个输入。如何选择一个来聚焦?在这种情况下,我必须创建动态吗?

  • 我使用spring boot和spring boot starter hateoas开发了一个rest服务。我在定制ObjectMapper时遇到了一个问题。代码如下: 一个pplication.java 依赖关系: 账单java: BillController.java: 我得到的输出是: 但是我需要“账单”代替“billList”。这是因为ObjectMapper没有被定制。我是否错过了任何配