装饰服务的循环引用问题
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 发布后,您将可以直接更新。
作为 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 发布后,您将可以直接更新。