Skip to content

Commit cecd948

Browse files
authored
Checking the output option when calculating property metadata (#3696)
1 parent ee275d2 commit cecd948

File tree

3 files changed

+29
-3
lines changed

3 files changed

+29
-3
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
* OpenAPI: Do not set scheme to oauth2 when generating securitySchemes (#4073)
1616
* OpenAPI: Fix missing `$ref` when no `type` is used in context (#4076)
1717
* GraphQL: Fix "Resource class cannot be determined." error when a null iterable field is returned (#4092)
18+
* Metadata: Check the output class when calculating serializer groups (#3696)
1819

1920
## 2.6.2
2021

src/Metadata/Property/Factory/SerializerPropertyMetadataFactory.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,11 @@ private function getSerializerAttributeMetadata(string $class, string $attribute
209209
*/
210210
private function getClassSerializerGroups(string $class): array
211211
{
212+
$resourceMetadata = $this->resourceMetadataFactory->create($class);
213+
if ($outputClass = $resourceMetadata->getAttribute('output')['class'] ?? null) {
214+
$class = $outputClass;
215+
}
216+
212217
$serializerClassMetadata = $this->serializerClassMetadataFactory->getMetadataFor($class);
213218

214219
$groups = [];

tests/Metadata/Property/Factory/SerializerPropertyMetadataFactoryTest.php

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
use ApiPlatform\Core\Metadata\Resource\ResourceMetadata;
2222
use ApiPlatform\Core\Tests\Fixtures\DummyIgnoreProperty;
2323
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\Dummy;
24+
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\DummyCar;
2425
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\DummyTableInheritance;
2526
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\DummyTableInheritanceChild;
2627
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\RelatedDummy;
@@ -56,7 +57,7 @@ public function testConstruct()
5657
/**
5758
* @dataProvider groupsProvider
5859
*/
59-
public function testCreate($readGroups, $writeGroups)
60+
public function testCreate($readGroups, $writeGroups, ?string $relatedOutputClass = null)
6061
{
6162
$resourceMetadataFactoryProphecy = $this->prophesize(ResourceMetadataFactoryInterface::class);
6263
$dummyResourceMetadata = (new ResourceMetadata())
@@ -69,6 +70,13 @@ public function testCreate($readGroups, $writeGroups)
6970
],
7071
]);
7172
$resourceMetadataFactoryProphecy->create(Dummy::class)->willReturn($dummyResourceMetadata);
73+
$relatedDummyResourceMetadata = new ResourceMetadata();
74+
if ($relatedOutputClass) {
75+
$relatedDummyResourceMetadata = $relatedDummyResourceMetadata->withAttributes([
76+
'output' => ['class' => $relatedOutputClass],
77+
]);
78+
}
79+
$resourceMetadataFactoryProphecy->create(RelatedDummy::class)->willReturn($relatedDummyResourceMetadata);
7280

7381
$serializerClassMetadataFactoryProphecy = $this->prophesize(SerializerClassMetadataFactoryInterface::class);
7482
$dummySerializerClassMetadata = new SerializerClassMetadata(Dummy::class);
@@ -88,6 +96,12 @@ public function testCreate($readGroups, $writeGroups)
8896
$nameSerializerAttributeMetadata->addGroup('dummy_read');
8997
$relatedDummySerializerClassMetadata->addAttributeMetadata($nameSerializerAttributeMetadata);
9098
$serializerClassMetadataFactoryProphecy->getMetadataFor(RelatedDummy::class)->willReturn($relatedDummySerializerClassMetadata);
99+
$dummyCarSerializerClassMetadata = new SerializerClassMetadata(DummyCar::class);
100+
$nameSerializerAttributeMetadata = new SerializerAttributeMetadata('name');
101+
$nameSerializerAttributeMetadata->addGroup('dummy_car_read');
102+
$nameSerializerAttributeMetadata->addGroup('dummy_write');
103+
$dummyCarSerializerClassMetadata->addAttributeMetadata($nameSerializerAttributeMetadata);
104+
$serializerClassMetadataFactoryProphecy->getMetadataFor(DummyCar::class)->willReturn($dummyCarSerializerClassMetadata);
91105

92106
$decoratedProphecy = $this->prophesize(PropertyMetadataFactoryInterface::class);
93107
$fooPropertyMetadata = (new PropertyMetadata())
@@ -120,8 +134,13 @@ public function testCreate($readGroups, $writeGroups)
120134
$this->assertInstanceOf(PropertyMetadata::class, $actual[1]);
121135
$this->assertTrue($actual[1]->isReadable());
122136
$this->assertTrue($actual[1]->isWritable());
123-
$this->assertTrue($actual[1]->isReadableLink());
124-
$this->assertFalse($actual[1]->isWritableLink());
137+
if ($relatedOutputClass) {
138+
$this->assertFalse($actual[1]->isReadableLink());
139+
$this->assertTrue($actual[1]->isWritableLink());
140+
} else {
141+
$this->assertTrue($actual[1]->isReadableLink());
142+
$this->assertFalse($actual[1]->isWritableLink());
143+
}
125144

126145
$this->assertInstanceOf(PropertyMetadata::class, $actual[2]);
127146
$this->assertFalse($actual[2]->isReadable());
@@ -133,6 +152,7 @@ public function groupsProvider(): array
133152
return [
134153
[['dummy_read'], ['dummy_write']],
135154
['dummy_read', 'dummy_write'],
155+
['dummy_read', 'dummy_write', DummyCar::class],
136156
];
137157
}
138158

0 commit comments

Comments
 (0)