Skip to content

Commit cf69423

Browse files
authored
Specify AdditionalProperties according to allow_extra_attributes (api-platform#3829)
* Specify AdditionalProperties according to allow_extra_attributes * fix phpstan
1 parent 51dfcd2 commit cf69423

File tree

5 files changed

+49
-51
lines changed

5 files changed

+49
-51
lines changed

phpstan.neon.dist

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,6 @@ parameters:
9292
-
9393
message: '#Service "test" is not registered in the container\.#'
9494
path: tests/GraphQl/Type/TypesContainerTest.php
95-
# https://github.com/phpstan/phpstan/issues/2999
96-
-
97-
message: '#ArrayObject<string, bool\|string> does not accept array<string, mixed>\.#'
98-
path: src/JsonSchema/SchemaFactory.php
9995

10096
# Expected, due to optional interfaces
10197
- '#Method ApiPlatform\\Core\\Bridge\\Doctrine\\Orm\\Extension\\QueryCollectionExtensionInterface::applyToCollection\(\) invoked with 5 parameters, 3-4 required\.#'

src/JsonSchema/SchemaFactory.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ public function buildSchema(string $className, string $format = 'json', string $
109109
return $schema;
110110
}
111111

112-
$definition = new \ArrayObject(['type' => 'object', 'additionalProperties' => false]);
112+
$definition = new \ArrayObject(['type' => 'object', 'additionalProperties' => $serializerContext[AbstractNormalizer::ALLOW_EXTRA_ATTRIBUTES] ?? true]);
113113
$definitions[$definitionName] = $definition;
114114
if (null !== $resourceMetadata && null !== $description = $resourceMetadata->getDescription()) {
115115
$definition['description'] = $description;

tests/JsonSchema/SchemaFactoryTest.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
use PHPUnit\Framework\TestCase;
3131
use Prophecy\Argument;
3232
use Symfony\Component\PropertyInfo\Type;
33+
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
3334

3435
class SchemaFactoryTest extends TestCase
3536
{
@@ -73,7 +74,7 @@ public function testBuildSchemaForNonResourceClass(): void
7374
$this->assertArrayHasKey($rootDefinitionKey, $definitions);
7475
$this->assertArrayHasKey('type', $definitions[$rootDefinitionKey]);
7576
$this->assertSame('object', $definitions[$rootDefinitionKey]['type']);
76-
$this->assertFalse($definitions[$rootDefinitionKey]['additionalProperties']);
77+
$this->assertTrue($definitions[$rootDefinitionKey]['additionalProperties']);
7778
$this->assertArrayHasKey('properties', $definitions[$rootDefinitionKey]);
7879
$this->assertArrayHasKey('foo', $definitions[$rootDefinitionKey]['properties']);
7980
$this->assertArrayHasKey('type', $definitions[$rootDefinitionKey]['properties']['foo']);
@@ -98,6 +99,7 @@ public function testBuildSchemaForOperationWithOverriddenSerializerGroups(): voi
9899
'put' => [
99100
'normalization_context' => [
100101
'groups' => 'overridden_operation_dummy_put',
102+
AbstractNormalizer::ALLOW_EXTRA_ATTRIBUTES => false,
101103
],
102104
'validation_groups' => ['validation_groups_dummy_put'],
103105
],

tests/Swagger/Serializer/DocumentationNormalizerV2Test.php

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ private function doTestNormalize(OperationMethodResolverInterface $operationMeth
128128
'custom' => ['method' => 'GET', 'path' => '/foo', 'status' => '202'] + self::OPERATION_FORMATS,
129129
'custom2' => ['method' => 'POST', 'path' => '/foo'] + self::OPERATION_FORMATS,
130130
],
131-
['pagination_client_items_per_page' => true]
131+
['pagination_client_items_per_page' => true, 'normalization_context' => [AbstractNormalizer::ALLOW_EXTRA_ATTRIBUTES => false]]
132132
);
133133
$resourceMetadataFactoryProphecy = $this->prophesize(ResourceMetadataFactoryInterface::class);
134134
$resourceMetadataFactoryProphecy->create(Dummy::class)->willReturn($dummyMetadata);
@@ -462,7 +462,7 @@ private function doTestNormalizeWithNameConverter(bool $legacy = false): void
462462
'definitions' => new \ArrayObject([
463463
'Dummy' => new \ArrayObject([
464464
'type' => 'object',
465-
'additionalProperties' => false,
465+
'additionalProperties' => true,
466466
'description' => 'This is a dummy.',
467467
'properties' => [
468468
'name' => new \ArrayObject([
@@ -575,7 +575,7 @@ public function testNormalizeWithApiKeysEnabled(): void
575575
'definitions' => new \ArrayObject([
576576
'Dummy' => new \ArrayObject([
577577
'type' => 'object',
578-
'additionalProperties' => false,
578+
'additionalProperties' => true,
579579
'description' => 'This is a dummy.',
580580
'properties' => [
581581
'name' => new \ArrayObject([
@@ -768,7 +768,7 @@ public function testNormalizeWithOnlyNormalizationGroups(): void
768768
'definitions' => new \ArrayObject([
769769
'Dummy' => new \ArrayObject([
770770
'type' => 'object',
771-
'additionalProperties' => false,
771+
'additionalProperties' => true,
772772
'description' => 'This is a dummy.',
773773
'externalDocs' => ['url' => 'http://schema.example.com/Dummy'],
774774
'properties' => [
@@ -780,7 +780,7 @@ public function testNormalizeWithOnlyNormalizationGroups(): void
780780
]),
781781
$ref => new \ArrayObject([
782782
'type' => 'object',
783-
'additionalProperties' => false,
783+
'additionalProperties' => true,
784784
'description' => 'This is a dummy.',
785785
'externalDocs' => ['url' => 'http://schema.example.com/Dummy'],
786786
'properties' => [
@@ -968,7 +968,7 @@ public function testNormalizeNotAddExtraBodyParameters(): void
968968
'definitions' => new \ArrayObject([
969969
'Dummy' => new \ArrayObject([
970970
'type' => 'object',
971-
'additionalProperties' => false,
971+
'additionalProperties' => true,
972972
'description' => 'This is a dummy.',
973973
'externalDocs' => ['url' => 'http://schema.example.com/Dummy'],
974974
'properties' => [
@@ -980,7 +980,7 @@ public function testNormalizeNotAddExtraBodyParameters(): void
980980
]),
981981
$ref => new \ArrayObject([
982982
'type' => 'object',
983-
'additionalProperties' => false,
983+
'additionalProperties' => true,
984984
'description' => 'This is a dummy.',
985985
'externalDocs' => ['url' => 'http://schema.example.com/Dummy'],
986986
'properties' => [
@@ -1069,7 +1069,7 @@ public function testNormalizeWithSwaggerDefinitionName(): void
10691069
'definitions' => new \ArrayObject([
10701070
'Dummy-Read' => new \ArrayObject([
10711071
'type' => 'object',
1072-
'additionalProperties' => false,
1072+
'additionalProperties' => true,
10731073
'description' => 'This is a dummy.',
10741074
'externalDocs' => ['url' => 'http://schema.example.com/Dummy'],
10751075
'properties' => [
@@ -1243,7 +1243,7 @@ public function testNormalizeWithOnlyDenormalizationGroups(): void
12431243
'definitions' => new \ArrayObject([
12441244
'Dummy' => new \ArrayObject([
12451245
'type' => 'object',
1246-
'additionalProperties' => false,
1246+
'additionalProperties' => true,
12471247
'description' => 'This is a dummy.',
12481248
'externalDocs' => ['url' => 'http://schema.example.com/Dummy'],
12491249
'properties' => [
@@ -1255,7 +1255,7 @@ public function testNormalizeWithOnlyDenormalizationGroups(): void
12551255
]),
12561256
'Dummy-dummy' => new \ArrayObject([
12571257
'type' => 'object',
1258-
'additionalProperties' => false,
1258+
'additionalProperties' => true,
12591259
'description' => 'This is a dummy.',
12601260
'externalDocs' => ['url' => 'http://schema.example.com/Dummy'],
12611261
'properties' => [
@@ -1431,7 +1431,7 @@ public function testNormalizeWithNormalizationAndDenormalizationGroups(): void
14311431
'definitions' => new \ArrayObject([
14321432
'Dummy' => new \ArrayObject([
14331433
'type' => 'object',
1434-
'additionalProperties' => false,
1434+
'additionalProperties' => true,
14351435
'description' => 'This is a dummy.',
14361436
'externalDocs' => ['url' => 'http://schema.example.com/Dummy'],
14371437
'properties' => [
@@ -1443,7 +1443,7 @@ public function testNormalizeWithNormalizationAndDenormalizationGroups(): void
14431443
]),
14441444
'Dummy-dummy' => new \ArrayObject([
14451445
'type' => 'object',
1446-
'additionalProperties' => false,
1446+
'additionalProperties' => true,
14471447
'description' => 'This is a dummy.',
14481448
'externalDocs' => ['url' => 'http://schema.example.com/Dummy'],
14491449
'properties' => [
@@ -1620,7 +1620,7 @@ public function testNormalizeSkipsNotReadableAndNotWritableProperties(): void
16201620
'definitions' => new \ArrayObject([
16211621
'Dummy' => new \ArrayObject([
16221622
'type' => 'object',
1623-
'additionalProperties' => false,
1623+
'additionalProperties' => true,
16241624
'description' => 'This is a dummy.',
16251625
'externalDocs' => ['url' => 'http://schema.example.com/Dummy'],
16261626
'properties' => [
@@ -2014,7 +2014,7 @@ public function testNormalizeWithNestedNormalizationGroups(): void
20142014
'definitions' => new \ArrayObject([
20152015
'Dummy' => new \ArrayObject([
20162016
'type' => 'object',
2017-
'additionalProperties' => false,
2017+
'additionalProperties' => true,
20182018
'description' => 'This is a dummy.',
20192019
'externalDocs' => ['url' => 'http://schema.example.com/Dummy'],
20202020
'properties' => [
@@ -2026,7 +2026,7 @@ public function testNormalizeWithNestedNormalizationGroups(): void
20262026
]),
20272027
$ref => new \ArrayObject([
20282028
'type' => 'object',
2029-
'additionalProperties' => false,
2029+
'additionalProperties' => true,
20302030
'description' => 'This is a dummy.',
20312031
'externalDocs' => ['url' => 'http://schema.example.com/Dummy'],
20322032
'properties' => [
@@ -2042,7 +2042,7 @@ public function testNormalizeWithNestedNormalizationGroups(): void
20422042
]),
20432043
$relatedDummyRef => new \ArrayObject([
20442044
'type' => 'object',
2045-
'additionalProperties' => false,
2045+
'additionalProperties' => true,
20462046
'description' => 'This is a related dummy.',
20472047
'externalDocs' => ['url' => 'http://schema.example.com/RelatedDummy'],
20482048
'properties' => [
@@ -2152,7 +2152,7 @@ private function doTestNormalizeWithFilters($filterLocator): void
21522152
'definitions' => new \ArrayObject([
21532153
'Dummy' => new \ArrayObject([
21542154
'type' => 'object',
2155-
'additionalProperties' => false,
2155+
'additionalProperties' => true,
21562156
'description' => 'This is a dummy.',
21572157
'properties' => [
21582158
'name' => new \ArrayObject([
@@ -2312,7 +2312,7 @@ private function doTestNormalizeWithSubResource(OperationAwareFormatsProviderInt
23122312
'definitions' => new \ArrayObject([
23132313
'Question' => new \ArrayObject([
23142314
'type' => 'object',
2315-
'additionalProperties' => false,
2315+
'additionalProperties' => true,
23162316
'description' => 'This is a question.',
23172317
'externalDocs' => ['url' => 'http://schema.example.com/Question'],
23182318
'properties' => [
@@ -2325,7 +2325,7 @@ private function doTestNormalizeWithSubResource(OperationAwareFormatsProviderInt
23252325
]),
23262326
'Answer' => new \ArrayObject([
23272327
'type' => 'object',
2328-
'additionalProperties' => false,
2328+
'additionalProperties' => true,
23292329
'description' => 'This is an answer.',
23302330
'externalDocs' => ['url' => 'http://schema.example.com/Answer'],
23312331
'properties' => [
@@ -2409,7 +2409,7 @@ public function testNormalizeWithPropertySwaggerContext(): void
24092409
'definitions' => new \ArrayObject([
24102410
'Dummy' => new \ArrayObject([
24112411
'type' => 'object',
2412-
'additionalProperties' => false,
2412+
'additionalProperties' => true,
24132413
'description' => 'This is a dummy.',
24142414
'externalDocs' => ['url' => 'http://schema.example.com/Dummy'],
24152415
'properties' => [
@@ -2510,7 +2510,7 @@ public function testNormalizeWithPaginationClientEnabled(): void
25102510
'definitions' => new \ArrayObject([
25112511
'Dummy' => new \ArrayObject([
25122512
'type' => 'object',
2513-
'additionalProperties' => false,
2513+
'additionalProperties' => true,
25142514
'description' => 'This is a dummy.',
25152515
'externalDocs' => ['url' => 'http://schema.example.com/Dummy'],
25162516
'properties' => [
@@ -2706,7 +2706,7 @@ private function doTestNormalizeWithCustomFormatsDefinedAtOperationLevel(Operati
27062706
'definitions' => new \ArrayObject([
27072707
'Dummy' => new \ArrayObject([
27082708
'type' => 'object',
2709-
'additionalProperties' => false,
2709+
'additionalProperties' => true,
27102710
'description' => 'This is a dummy.',
27112711
'externalDocs' => ['url' => 'http://schema.example.com/Dummy'],
27122712
'properties' => [
@@ -2915,7 +2915,7 @@ private function doTestNormalizeWithInputAndOutputClass(): void
29152915
'definitions' => new \ArrayObject([
29162916
'Dummy:300dcd476cef011532fb0ca7683395d7' => new \ArrayObject([
29172917
'type' => 'object',
2918-
'additionalProperties' => false,
2918+
'additionalProperties' => true,
29192919
'description' => 'This is a dummy.',
29202920
'externalDocs' => [
29212921
'url' => 'http://schema.example.com/Dummy',
@@ -2934,7 +2934,7 @@ private function doTestNormalizeWithInputAndOutputClass(): void
29342934
]),
29352935
'Dummy:b4f76c1a44965bd401aa23bb37618acc' => new \ArrayObject([
29362936
'type' => 'object',
2937-
'additionalProperties' => false,
2937+
'additionalProperties' => true,
29382938
'description' => 'This is a dummy.',
29392939
'externalDocs' => [
29402940
'url' => 'http://schema.example.com/Dummy',

0 commit comments

Comments
 (0)