8000 bug #37860 [Serializer][ClassDiscriminatorMapping] Fix getMappedObjec… · symfony/symfony@7f7b447 · GitHub
[go: up one dir, main page]

Skip to content

Commit 7f7b447

Browse files
committed
bug #37860 [Serializer][ClassDiscriminatorMapping] Fix getMappedObjectType() when a discriminator child extends another one (fancyweb)
This PR was merged into the 4.4 branch. Discussion ---------- [Serializer][ClassDiscriminatorMapping] Fix getMappedObjectType() when a discriminator child extends another one | Q | A | ------------- | --- | Branch? | 4.4 | Bug fix? | yes | New feature? | no | Deprecations? | no | Tickets | #37742 | License | MIT | Doc PR | - The strategy is to sort the passed classes from the "bottom" one in the hierarchy to the "top" one so that the first `is_a` in `getMappedObjectType()` is right. Commits ------- c16a192 [Serializer][ClassDiscriminatorMapping] Fix getMappedObjectType() when a discriminator child extends another one
2 parents 3b9cf82 + c16a192 commit 7f7b447

File tree

5 files changed

+35
-1
lines changed

5 files changed

+35
-1
lines changed

src/Symfony/Component/Serializer/Mapping/ClassDiscriminatorMapping.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,18 @@ public function __construct(string $typeProperty, array $typesMapping = [])
2323
{
2424
$this->typeProperty = $typeProperty;
2525
$this->typesMapping = $typesMapping;
26+
27+
uasort($this->typesMapping, static function (string $a, string $b): int {
28+
if (is_a($a, $b, true)) {
29+
return -1;
30+
}
31+
32+
if (is_a($b, $a, true)) {
33+
return 1;
34+
}
35+
36+
return 0;
37+
});
2638
}
2739

2840
public function getTypeProperty(): string

src/Symfony/Component/Serializer/Tests/Fixtures/AbstractDummy.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616
/**
1717
* @DiscriminatorMap(typeProperty="type", mapping={
1818
* "first"="Symfony\Component\Serializer\Tests\Fixtures\AbstractDummyFirstChild",
19-
* "second"="Symfony\Component\Serializer\Tests\Fixtures\AbstractDummySecondChild"
19+
* "second"="Symfony\Component\Serializer\Tests\Fixtures\AbstractDummySecondChild",
20+
* "third"="Symfony\Component\Serializer\Tests\Fixtures\AbstractDummyThirdChild",
2021
* })
2122
*/
2223
abstract class AbstractDummy
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\Serializer\Tests\Fixtures;
13+
14+
final class AbstractDummyThirdChild extends AbstractDummyFirstChild
15+
{
16+
}

src/Symfony/Component/Serializer/Tests/Mapping/ClassDiscriminatorMappingTest.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Symfony\Component\Serializer\Mapping\ClassDiscriminatorMapping;
1616
use Symfony\Component\Serializer\Tests\Fixtures\AbstractDummyFirstChild;
1717
use Symfony\Component\Serializer\Tests\Fixtures\AbstractDummySecondChild;
18+
use Symfony\Component\Serializer\Tests\Fixtures\AbstractDummyThirdChild;
1819

1920
/**
2021
* @author Samuel Roze <samuel.roze@gmail.com>
@@ -35,9 +36,11 @@ public function testMappedObjectType()
3536
{
3637
$mapping = new ClassDiscriminatorMapping('type', [
3738
'first' => AbstractDummyFirstChild::class,
39+
'third' => AbstractDummyThirdChild::class,
3840
]);
3941

4042
$this->assertEquals('first', $mapping->getMappedObjectType(new AbstractDummyFirstChild()));
4143
$this->assertNull($mapping->getMappedObjectType(new AbstractDummySecondChild()));
44+
$this->assertSame('third', $mapping->getMappedObjectType(new AbstractDummyThirdChild()));
4245
}
4346
}

src/Symfony/Component/Serializer/Tests/Mapping/Loader/AnnotationLoaderTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
use Symfony\Component\Serializer\Tests\Fixtures\AbstractDummy;
2121
use Symfony\Component\Serializer\Tests\Fixtures\AbstractDummyFirstChild;
2222
use Symfony\Component\Serializer\Tests\Fixtures\AbstractDummySecondChild;
23+
use Symfony\Component\Serializer\Tests\Fixtures\AbstractDummyThirdChild;
2324
use Symfony\Component\Serializer\Tests\Mapping\TestClassMetadataFactory;
2425

2526
/**
@@ -65,6 +66,7 @@ public function testLoadDiscriminatorMap()
6566
$expected = new ClassMetadata(AbstractDummy::class, new ClassDiscriminatorMapping('type', [
6667
'first' => AbstractDummyFirstChild::class,
6768
'second' => AbstractDummySecondChild::class,
69+
'third' => AbstractDummyThirdChild::class,
6870
]));
6971

7072
$expected->addAttributeMetadata(new AttributeMetadata('foo'));

0 commit comments

Comments
 (0)
0