Symfony串行化器自定义反规格化器

t3psigkw  于 2023-01-05  发布在  其他
关注(0)|答案(1)|浏览(125)

我想用一个自定义的反规范化器来修饰Symfony序列化器的ArrayDenormalizer,但是它似乎遇到了DependencyInjection中的循环引用问题,因为Nginx在502中崩溃。
自定义的Denormalizer实现了DenormalizerAwareInterface,所以我实际上期望Symfony会通过Autowiring自动处理依赖注入。

<?php

namespace App\Serializer;

use App\MyEntity;
use Symfony\Component\Serializer\Normalizer\DenormalizerAwareInterface;
use Symfony\Component\Serializer\Normalizer\DenormalizerAwareTrait;
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;

class PreCheckRequestDenormalizer implements DenormalizerInterface, DenormalizerAwareInterface
{
    use DenormalizerAwareTrait;

    public function denormalize(mixed $data, string $type, string $format = null, array $context = [])
    {
        if (in_array($data['locale'], ['de', 'en']) === false) {
            $data['locale'] = 'en';
        }

        return $this->denormalizer->denormalize($data, $type, $format, $context);
    }

    public function supportsDenormalization(mixed $data, string $type, string $format = null)
    {
        return is_array($data) && $type === MyEntity::class;
    }
}

我错过了什么?顺便说一句,这是Symfony 6. 1。

tktrz96b

tktrz96b1#

这似乎是Symfony 6.1中 NormalizeAwareInterface 自动安装的一个错误:https://github.com/symfony/maker-bundle/issues/1252#issuecomment-1342478104
此错误导致循环引用问题。
我通过不使用 DenormalizerAwareInterfaceDenormalizerAwareTrait 以及禁用自定义Denormalizer的自动装配并显式声明服务来解决这个问题:

App\Serializer\PreCheckRequestDenormalizer:
    autowire: false
    arguments:
      $denormalizer: '@serializer.normalizer.object'
      $allowedLocales: '%app.allowed_locales%'
      $defaultLocale: '%env(string:DEFAULT_LOCALE)%'

这个问题的评论描述了可能进一步的其他方式,但这为我解决了它。

相关问题