Skip to content

Commit 4125166

Browse files
authored
Merge pull request #1175 from schmittjoh/FrKevin-master
Handle discriminator groups
2 parents 25a829b + 1e364e0 commit 4125166

9 files changed

Lines changed: 150 additions & 0 deletions

File tree

src/Metadata/ClassMetadata.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,7 @@ public function merge(MergeableInterface $object): void
237237
$this->discriminatorFieldName = $object->discriminatorFieldName;
238238
$this->discriminatorMap = $object->discriminatorMap;
239239
$this->discriminatorBaseClass = $object->discriminatorBaseClass;
240+
$this->discriminatorGroups = $object->discriminatorGroups;
240241
}
241242

242243
$this->handleDiscriminatorProperty();
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace JMS\Serializer\Tests\Fixtures\Discriminator\Serialization;
6+
7+
use JMS\Serializer\Annotation as JMS;
8+
use ReflectionClass;
9+
use ReflectionException;
10+
11+
abstract class Entity
12+
{
13+
/**
14+
* @JMS\Type("int")
15+
* @JMS\Groups({"base"})
16+
* @var int
17+
*/
18+
public $id;
19+
20+
public function __construct(int $id)
21+
{
22+
$this->id = $id;
23+
}
24+
25+
/**
26+
* @throws ReflectionException
27+
*
28+
* @JMS\VirtualProperty()
29+
* @JMS\SerializedName("entityName")
30+
* @JMS\Groups({"entity.identification"})
31+
*/
32+
public function getEntityName(): string
33+
{
34+
$reflect = new ReflectionClass($this);
35+
return $reflect->getShortName();
36+
}
37+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace JMS\Serializer\Tests\Fixtures\Discriminator\Serialization;
6+
7+
use JMS\Serializer\Annotation as JMS;
8+
9+
class ExtendedUser extends User
10+
{
11+
/**
12+
* @JMS\Type("string")
13+
* @JMS\Groups({"base"})
14+
* @var string
15+
*/
16+
public $extendAttribute;
17+
18+
public function __construct($id, $name, $description, $extendAttribute)
19+
{
20+
parent::__construct($id, $name, $description);
21+
$this->extendAttribute = $extendAttribute;
22+
}
23+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace JMS\Serializer\Tests\Fixtures\Discriminator\Serialization;
6+
7+
use JMS\Serializer\Annotation as JMS;
8+
9+
/**
10+
* Class User
11+
*
12+
* @JMS\Discriminator(field = "entityName",
13+
* groups={"entity.identification"},
14+
* map = {
15+
* "User": "JMS\Serializer\Tests\Fixtures\Discriminator\Serialization\User",
16+
* "ExtendedUser": "JMS\Serializer\Tests\Fixtures\Discriminator\Serialization\ExtendedUser"
17+
* })
18+
*/
19+
class User extends Entity
20+
{
21+
/**
22+
* @JMS\Type("string")
23+
* @JMS\Groups({"base"})
24+
* @var string
25+
*/
26+
public $name;
27+
/**
28+
* @JMS\Type("string")
29+
* @JMS\Groups({"base"})
30+
* @var string
31+
*/
32+
public $description;
33+
34+
public function __construct(int $id, string $name, string $description)
35+
{
36+
parent::__construct($id);
37+
$this->name = $name;
38+
$this->description = $description;
39+
}
40+
}

tests/Serializer/BaseSerializationTest.php

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@
5151
use JMS\Serializer\Tests\Fixtures\Discriminator\ImagePost;
5252
use JMS\Serializer\Tests\Fixtures\Discriminator\Moped;
5353
use JMS\Serializer\Tests\Fixtures\Discriminator\Post;
54+
use JMS\Serializer\Tests\Fixtures\Discriminator\Serialization\ExtendedUser;
55+
use JMS\Serializer\Tests\Fixtures\Discriminator\Serialization\User;
5456
use JMS\Serializer\Tests\Fixtures\DiscriminatorGroup\Car as DiscriminatorGroupCar;
5557
use JMS\Serializer\Tests\Fixtures\ExclusionStrategy\AlwaysExcludeExclusionStrategy;
5658
use JMS\Serializer\Tests\Fixtures\FirstClassListCollection;
@@ -1312,6 +1314,33 @@ public function testPolymorphicObjectsWithGroup()
13121314
);
13131315
}
13141316

1317+
public function getDiscrimatorObjectsSamples(): array
1318+
{
1319+
$u1 = new User(5, 'userName', 'userDesc');
1320+
$u2 = new ExtendedUser(5, 'userName', 'userDesc', 'extednedContent');
1321+
$arr = new ArrayCollection([$u1, $u2]);
1322+
1323+
return [
1324+
[$u1, 'user_discriminator'],
1325+
[$u2, 'user_discriminator_extended'],
1326+
[$arr, 'user_discriminator_array'],
1327+
];
1328+
}
1329+
1330+
/**
1331+
* Test serializing entity that uses Discriminator and extends some base model class
1332+
*
1333+
* @dataProvider getDiscrimatorObjectsSamples
1334+
*/
1335+
public function testDiscrimatorObjects($data, $contentId)
1336+
{
1337+
$context = SerializationContext::create()->setGroups(['entity.identification']);
1338+
self::assertEquals(
1339+
$this->getContent($contentId),
1340+
$this->serialize($data, $context)
1341+
);
1342+
}
1343+
13151344
/**
13161345
* @group polymorphic
13171346
*/

tests/Serializer/JsonSerializationTest.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,9 @@ protected function getContent($key)
125125
$outputs['array_iterator'] = '{"iterator":{"foo":"bar","bar":"foo"}}';
126126
$outputs['generator'] = '{"generator":{"foo":"bar","bar":"foo"}}';
127127
$outputs['ParentNoMetadataChildObject'] = '{"bar":"John"}';
128+
$outputs['user_discriminator_array'] = '[{"entityName":"User"},{"entityName":"ExtendedUser"}]';
129+
$outputs['user_discriminator'] = '{"entityName":"User"}';
130+
$outputs['user_discriminator_extended'] = '{"entityName":"ExtendedUser"}';
128131
}
129132

130133
if (!isset($outputs[$key])) {
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<result>
3+
<entityName><![CDATA[User]]></entityName>
4+
</result>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<result>
3+
<entry>
4+
<entityName><![CDATA[User]]></entityName>
5+
</entry>
6+
<entry>
7+
<entityName><![CDATA[ExtendedUser]]></entityName>
8+
</entry>
9+
</result>
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<result>
3+
<entityName><![CDATA[ExtendedUser]]></entityName>
4+
</result>

0 commit comments

Comments
 (0)