php - 装饰服务的循环引用问题

标签 php symfony api-platform.com symfony-dependency-injection

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 或清除缓存时,它开始给我这个错误

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 依赖注入(inject)组件的问题。

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发布后,您将可以直接更新。

关于php - 装饰服务的循环引用问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69000067/

相关文章:

php - 2 个日期值之间的随机时间和日期

symfony - FOSUserBundle - Redis 中的用户实体

database - API 平台 - 处理大数据库的分页

PHP/mySQL Insert 然后调用存储过程获取id

javascript - php-js的执行顺序是什么?

php - 如何在 Drupal 中获取当前页面的 URL?

mysql - 将多个 SELECT 规则转换为单个 DQL 查询

php - Symfony2 - 从 Controller 到监听器的变量

php - api-platform odm iri 引用不会被转换成 json 中的对象

php - 使用 API 平台创建报告端点 (https ://api-platform. com)