Skip to content

Commit 412e38e

Browse files
committed
fix: use validation groups for property metadata in JSON Schema factory
1 parent 8e58a98 commit 412e38e

File tree

2 files changed

+26
-12
lines changed

2 files changed

+26
-12
lines changed

src/JsonSchema/SchemaFactory.php

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public function buildSchema(string $className, string $format = 'json', string $
7272
if (null === $metadata = $this->getMetadata($className, $type, $operationType, $operationName, $serializerContext)) {
7373
return $schema;
7474
}
75-
[$resourceMetadata, $serializerContext, $inputOrOutputClass] = $metadata;
75+
[$resourceMetadata, $serializerContext, $validationGroups, $inputOrOutputClass] = $metadata;
7676

7777
if (null === $resourceMetadata && (null !== $operationType || null !== $operationName)) {
7878
throw new \LogicException('The $operationType and $operationName arguments must be null for non-resource class.');
@@ -131,7 +131,7 @@ public function buildSchema(string $className, string $format = 'json', string $
131131
$definition['externalDocs'] = ['url' => $iri];
132132
}
133133

134-
$options = $this->getFactoryOptions($serializerContext, $operationType, $operationName);
134+
$options = $this->getFactoryOptions($serializerContext, $validationGroups, $operationType, $operationName);
135135
foreach ($this->propertyNameCollectionFactory->create($inputOrOutputClass, $options) as $propertyName) {
136136
$propertyMetadata = $this->propertyMetadataFactory->create($inputOrOutputClass, $propertyName, $options);
137137
if (!$propertyMetadata->isReadable() && !$propertyMetadata->isWritable()) {
@@ -200,18 +200,13 @@ private function buildPropertySchema(Schema $schema, string $definitionName, str
200200
}
201201

202202
$propertySchema = new \ArrayObject($propertySchema + $valueSchema);
203-
if (DocumentationNormalizer::OPENAPI_VERSION === $version) {
204-
$schema->getDefinitions()[$definitionName]['properties'][$normalizedPropertyName] = $propertySchema;
205-
206-
return;
207-
}
208203

209204
$schema->getDefinitions()[$definitionName]['properties'][$normalizedPropertyName] = $propertySchema;
210205
}
211206

212207
private function buildDefinitionName(string $className, string $format = 'json', string $type = Schema::TYPE_OUTPUT, ?string $operationType = null, ?string $operationName = null, ?array $serializerContext = null): string
213208
{
214-
[$resourceMetadata, $serializerContext, $inputOrOutputClass] = $this->getMetadata($className, $type, $operationType, $operationName, $serializerContext);
209+
[$resourceMetadata, $serializerContext,, $inputOrOutputClass] = $this->getMetadata($className, $type, $operationType, $operationName, $serializerContext);
215210

216211
$prefix = $resourceMetadata ? $resourceMetadata->getShortName() : (new \ReflectionClass($className))->getShortName();
217212
if (null !== $inputOrOutputClass && $className !== $inputOrOutputClass) {
@@ -239,6 +234,7 @@ private function getMetadata(string $className, string $type = Schema::TYPE_OUTP
239234
return [
240235
null,
241236
$serializerContext ?? [],
237+
[],
242238
$className,
243239
];
244240
}
@@ -259,6 +255,7 @@ private function getMetadata(string $className, string $type = Schema::TYPE_OUTP
259255
return [
260256
$resourceMetadata,
261257
$serializerContext ?? $this->getSerializerContext($resourceMetadata, $type, $operationType, $operationName),
258+
$this->getValidationGroups($resourceMetadata, $operationType, $operationName),
262259
$inputOrOutput['class'],
263260
];
264261
}
@@ -274,10 +271,21 @@ private function getSerializerContext(ResourceMetadata $resourceMetadata, string
274271
return $resourceMetadata->getTypedOperationAttribute($operationType, $operationName, $attribute, [], true);
275272
}
276273

274+
private function getValidationGroups(ResourceMetadata $resourceMetadata, ?string $operationType, ?string $operationName): array
275+
{
276+
$attribute = 'validation_groups';
277+
278+
if (null === $operationType || null === $operationName) {
279+
return $resourceMetadata->getAttribute($attribute, []);
280+
}
281+
282+
return $resourceMetadata->getTypedOperationAttribute($operationType, $operationName, $attribute, [], true);
283+
}
284+
277285
/**
278286
* Gets the options for the property name collection / property metadata factories.
279287
*/
280-
private function getFactoryOptions(array $serializerContext, ?string $operationType, ?string $operationName): array
288+
private function getFactoryOptions(array $serializerContext, array $validationGroups, ?string $operationType, ?string $operationName): array
281289
{
282290
$options = [];
283291

@@ -299,6 +307,10 @@ private function getFactoryOptions(array $serializerContext, ?string $operationT
299307
}
300308
}
301309

310+
if (!empty($validationGroups)) {
311+
$options['validation_groups'] = $validationGroups;
312+
}
313+
302314
return $options;
303315
}
304316
}

tests/JsonSchema/SchemaFactoryTest.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ public function testBuildSchemaForOperationWithOverriddenSerializerGroups(): voi
9898
'normalization_context' => [
9999
'groups' => 'overridden_operation_dummy_put',
100100
],
101+
'validation_groups' => ['validation_groups_dummy_put'],
101102
],
102103
], [], [
103104
'normalization_context' => [
@@ -106,21 +107,22 @@ public function testBuildSchemaForOperationWithOverriddenSerializerGroups(): voi
106107
]));
107108

108109
$serializerGroup = 'overridden_operation_dummy_put';
110+
$validationGroups = 'validation_groups_dummy_put';
109111

110112
$propertyNameCollectionFactoryProphecy = $this->prophesize(PropertyNameCollectionFactoryInterface::class);
111113
$propertyNameCollectionFactoryProphecy->create(OverriddenOperationDummy::class, Argument::allOf(
112114
Argument::type('array'),
113-
Argument::withEntry('serializer_groups', [$serializerGroup])
115+
Argument::allOf(Argument::withEntry('serializer_groups', [$serializerGroup]), Argument::withEntry('validation_groups', [$validationGroups]))
114116
))->willReturn(new PropertyNameCollection(['alias', 'description']));
115117

116118
$propertyMetadataFactoryProphecy = $this->prophesize(PropertyMetadataFactoryInterface::class);
117119
$propertyMetadataFactoryProphecy->create(OverriddenOperationDummy::class, 'alias', Argument::allOf(
118120
Argument::type('array'),
119-
Argument::withEntry('serializer_groups', [$serializerGroup])
121+
Argument::allOf(Argument::withEntry('serializer_groups', [$serializerGroup]), Argument::withEntry('validation_groups', [$validationGroups]))
120122
))->willReturn(new PropertyMetadata(new Type(Type::BUILTIN_TYPE_STRING), null, true));
121123
$propertyMetadataFactoryProphecy->create(OverriddenOperationDummy::class, 'description', Argument::allOf(
122124
Argument::type('array'),
123-
Argument::withEntry('serializer_groups', [$serializerGroup])
125+
Argument::allOf(Argument::withEntry('serializer_groups', [$serializerGroup]), Argument::withEntry('validation_groups', [$validationGroups]))
124126
))->willReturn(new PropertyMetadata(new Type(Type::BUILTIN_TYPE_STRING), null, true));
125127

126128
$resourceClassResolverProphecy = $this->prophesize(ResourceClassResolverInterface::class);

0 commit comments

Comments
 (0)