bug #38390 [Serializer][Minor] Fix circular reference exception message (bad limit displayed) (l-vo)

This PR was merged into the 4.4 branch.

Discussion
----------

[Serializer][Minor] Fix circular reference exception message (bad limit displayed)

| Q             | A
| ------------- | ---
| Branch?       | 4.4
| Bug fix?      | yes
| New feature?  | no
| Deprecations? | no
| Tickets       |
| License       | MIT
| Doc PR        |

Commits
-------

36ce9029f7 [Serializer][Minor] Fix exception message
This commit is contained in:
Fabien Potencier 2020-10-03 08:01:52 +02:00
commit 2ed3a0d33e
5 changed files with 25 additions and 12 deletions

View File

@ -327,7 +327,7 @@ abstract class AbstractNormalizer implements NormalizerInterface, DenormalizerIn
return $circularReferenceHandler($object, $format, $context); return $circularReferenceHandler($object, $format, $context);
} }
throw new CircularReferenceException(sprintf('A circular reference has been detected when serializing the object of class "%s" (configured limit: %d).', \get_class($object), $this->circularReferenceLimit)); throw new CircularReferenceException(sprintf('A circular reference has been detected when serializing the object of class "%s" (configured limit: %d).', \get_class($object), $context[self::CIRCULAR_REFERENCE_LIMIT] ?? $this->defaultContext[self::CIRCULAR_REFERENCE_LIMIT] ?? $this->circularReferenceLimit));
} }
/** /**

View File

@ -10,23 +10,36 @@ use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
*/ */
trait CircularReferenceTestTrait trait CircularReferenceTestTrait
{ {
abstract protected function getNormalizerForCircularReference(): NormalizerInterface; abstract protected function getNormalizerForCircularReference(array $defaultContext): NormalizerInterface;
abstract protected function getSelfReferencingModel(); abstract protected function getSelfReferencingModel();
public function testUnableToNormalizeCircularReference() public function provideUnableToNormalizeCircularReference(): array
{ {
$normalizer = $this->getNormalizerForCircularReference(); return [
[[], [], 1],
[['circular_reference_limit' => 2], [], 2],
[['circular_reference_limit' => 2], ['circular_reference_limit' => 3], 3],
];
}
/**
* @dataProvider provideUnableToNormalizeCircularReference
*/
public function testUnableToNormalizeCircularReference(array $defaultContext, array $context, int $expectedLimit)
{
$normalizer = $this->getNormalizerForCircularReference($defaultContext);
$obj = $this->getSelfReferencingModel(); $obj = $this->getSelfReferencingModel();
$this->expectException(CircularReferenceException::class); $this->expectException(CircularReferenceException::class);
$normalizer->normalize($obj, null, ['circular_reference_limit' => 2]); $this->expectExceptionMessage(sprintf('A circular reference has been detected when serializing the object of class "%s" (configured limit: %d).', \get_class($obj), $expectedLimit));
$normalizer->normalize($obj, null, $context);
} }
public function testCircularReferenceHandler() public function testCircularReferenceHandler()
{ {
$normalizer = $this->getNormalizerForCircularReference(); $normalizer = $this->getNormalizerForCircularReference([]);
$obj = $this->getSelfReferencingModel(); $obj = $this->getSelfReferencingModel();
$expected = ['me' => \get_class($obj)]; $expected = ['me' => \get_class($obj)];

View File

@ -247,10 +247,10 @@ class GetSetMethodNormalizerTest extends TestCase
); );
} }
protected function getNormalizerForCircularReference(): GetSetMethodNormalizer protected function getNormalizerForCircularReference(array $defaultContext): GetSetMethodNormalizer
{ {
$classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader())); $classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader()));
$normalizer = new GetSetMethodNormalizer($classMetadataFactory, new MetadataAwareNameConverter($classMetadataFactory)); $normalizer = new GetSetMethodNormalizer($classMetadataFactory, new MetadataAwareNameConverter($classMetadataFactory), null, null, null, $defaultContext);
new Serializer([$normalizer]); new Serializer([$normalizer]);
return $normalizer; return $normalizer;

View File

@ -365,9 +365,9 @@ class ObjectNormalizerTest extends TestCase
// circular reference // circular reference
protected function getNormalizerForCircularReference(): ObjectNormalizer protected function getNormalizerForCircularReference(array $defaultContext): ObjectNormalizer
{ {
$normalizer = new ObjectNormalizer(); $normalizer = new ObjectNormalizer(null, null, null, null, null, null, $defaultContext);
new Serializer([$normalizer]); new Serializer([$normalizer]);
return $normalizer; return $normalizer;

View File

@ -191,9 +191,9 @@ class PropertyNormalizerTest extends TestCase
$this->normalizer->setCallbacks($callbacks); $this->normalizer->setCallbacks($callbacks);
} }
protected function getNormalizerForCircularReference(): PropertyNormalizer protected function getNormalizerForCircularReference(array $defaultContext): PropertyNormalizer
{ {
$normalizer = new PropertyNormalizer(); $normalizer = new PropertyNormalizer(null, null, null, null, null, $defaultContext);
new Serializer([$normalizer]); new Serializer([$normalizer]);
return $normalizer; return $normalizer;