装饰服务的循环引用问题

Circular reference problem with decorated service

作为 the documentation suggests 我编写了这个服务来将 uuid 添加到规范化对象中:

<?php
namespace App\Serializer;

use InvalidArgumentException;
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
use Symfony\Component\Serializer\SerializerAwareInterface;
use Symfony\Component\Serializer\SerializerInterface;

final class ApiNormalizer implements NormalizerInterface, DenormalizerInterface, SerializerAwareInterface
{
    private DenormalizerInterface|NormalizerInterface $decorated;

    public function __construct(NormalizerInterface $decorated)
    {
        if (!$decorated instanceof DenormalizerInterface) {
            throw new InvalidArgumentException(sprintf('The decorated normalizer must implement the %s.', DenormalizerInterface::class));
        }

        $this->decorated = $decorated;
    }

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

    public function normalize($object, $format = null, array $context = [])
    {
        $data = $this->decorated->normalize($object, $format, $context);
        if(method_exists($object, 'getUuid') && is_array($data)){
            $data['uuid'] = $object->getUuid();
        }
        return $data;
    }

    /**
     * @param mixed $data
     * @param string $type
     * @param null $format
     *
     * @return bool
     */
    public function supportsDenormalization($data, $type, $format = null)
    {
        return $this->decorated->supportsDenormalization($data, $type, $format);
    }

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

    public function setSerializer(SerializerInterface $serializer)
    {
        if($this->decorated instanceof SerializerAwareInterface) {
            $this->decorated->setSerializer($serializer);
        }
    }
}

services.yaml

App\Serializer\ApiNormalizer:
    # By default .inner is passed as argument
    decorates: 'api_platform.jsonld.normalizer.item'

但是突然(直到昨天一切都很好)当我 运行 composer 或 cache clear

时它开始给我这个错误

In CheckCircularReferencesPass.php line 67: Circular reference detected for service "App\Serializer\ApiNormalizer", path: "App\Serializer\ApiNormalizer -> serializer -> App\Serializer\ApiNormalizer".

这是版本 5.3.7 上的 Symfony 依赖注入组件的问题。

https://github.com/symfony/symfony/issues/42792

这可能会在明天或后天得到解决。

同时,只需将此添加到您的 composer.json:

"conflict": {
    "symfony/dependency-injection": "5.3.7"
},

这样您就可以更新其余的依赖项,它只会排除 DI 5.3.7 而支持 5.3.6。

5.3.8 发布后,您将可以直接更新。