diff --git a/features/swagger/docs.feature b/features/swagger/docs.feature index f0012d15d74..b89b4a876d2 100644 --- a/features/swagger/docs.feature +++ b/features/swagger/docs.feature @@ -17,31 +17,31 @@ Feature: Documentation support # Supported classes And the Swagger class "AbstractDummy" exists And the Swagger class "CircularReference" exists - And the Swagger class "CircularReference_a0dd2858dcb0d966f739c1ac906afa2e" exists + And the Swagger class "CircularReference_groups_circular" exists And the Swagger class "CompositeItem" exists And the Swagger class "CompositeLabel" exists And the Swagger class "ConcreteDummy" exists And the Swagger class "CustomIdentifierDummy" exists - And the Swagger class "CustomNormalizedDummy_601856395b57c6b15175297eb6c9890e" exists - And the Swagger class "CustomNormalizedDummy_db9cba1a967111a02380774784c47722" exists + And the Swagger class "CustomNormalizedDummy_groups_input" exists + And the Swagger class "CustomNormalizedDummy_groups_output" exists And the Swagger class "CustomWritableIdentifierDummy" exists And the Swagger class "Dummy" exists And the Swagger class "RelatedDummy" exists And the Swagger class "DummyTableInheritance" exists And the Swagger class "DummyTableInheritanceChild" exists - And the Swagger class "OverriddenOperationDummy_441e1f98db3d0250bcb18dca087687c3" exists - And the Swagger class "OverriddenOperationDummy_45f46ed6dc6f412229a8c12cd5583586" exists - And the Swagger class "OverriddenOperationDummy_868796b9924a520acbb96f8b75dade9f" exists - And the Swagger class "OverriddenOperationDummy_ff74003f36aebfe31c696fae1f701ae4" exists + And the Swagger class "OverriddenOperationDummy_groups_overridden_operation_dummy_get" exists + And the Swagger class "OverriddenOperationDummy_groups_overridden_operation_dummy_put" exists + And the Swagger class "OverriddenOperationDummy_groups_overridden_operation_dummy_read" exists + And the Swagger class "OverriddenOperationDummy_groups_overridden_operation_dummy_write" exists And the Swagger class "RelatedDummy" exists And the Swagger class "NoCollectionDummy" exists And the Swagger class "RelatedToDummyFriend" exists - And the Swagger class "RelatedToDummyFriend_ad38b7a2760884e744c577a92e02b8c4" exists + And the Swagger class "RelatedToDummyFriend_groups_fakemanytomany" exists And the Swagger class "DummyFriend" exists - And the Swagger class "RelationEmbedder_ced9cba177bf3134e609fccf878df9a7" exists - And the Swagger class "RelationEmbedder_f02fd88a2291463447338402aee9a220" exists - And the Swagger class "User_4320517091b72c69e9f0c72aac0141e8" exists - And the Swagger class "User_7ce91261c0e731d95bb24b83b1f637b2" exists + And the Swagger class "RelationEmbedder_groups_barcelona" exists + And the Swagger class "RelationEmbedder_groups_chicago" exists + And the Swagger class "User_groups_user_user-read" exists + And the Swagger class "User_groups_user_user-write" exists And the Swagger class "UuidIdentifierDummy" exists And the Swagger class "ThirdLevel" exists And the Swagger class "ParentDummy" doesn't exist diff --git a/src/Swagger/Serializer/DocumentationNormalizer.php b/src/Swagger/Serializer/DocumentationNormalizer.php index a0b55ae5021..b522989875c 100644 --- a/src/Swagger/Serializer/DocumentationNormalizer.php +++ b/src/Swagger/Serializer/DocumentationNormalizer.php @@ -371,11 +371,7 @@ private function updateDeleteOperation(\ArrayObject $pathOperation, string $reso */ private function getDefinition(\ArrayObject $definitions, ResourceMetadata $resourceMetadata, string $resourceClass, array $serializerContext = null): string { - if (isset($serializerContext['groups'])) { - $definitionKey = sprintf('%s_%s', $resourceMetadata->getShortName(), md5(serialize($serializerContext['groups']))); - } else { - $definitionKey = $resourceMetadata->getShortName(); - } + $definitionKey = $this->getDefinitionKey($resourceMetadata->getShortName(), (array) ($serializerContext['groups'] ?? null)); if (!isset($definitions[$definitionKey])) { $definitions[$definitionKey] = []; // Initialize first to prevent infinite loop @@ -385,6 +381,17 @@ private function getDefinition(\ArrayObject $definitions, ResourceMetadata $reso return $definitionKey; } + /** + * @param string $resourceShortName + * @param array $groups + * + * @return string + */ + private function getDefinitionKey(string $resourceShortName, array $groups): string + { + return !$groups ? $resourceShortName : $resourceShortName.'_groups_'.implode('_', $groups); + } + /** * Gets a definition Schema Object. * diff --git a/tests/Swagger/Serializer/DocumentationNormalizerTest.php b/tests/Swagger/Serializer/DocumentationNormalizerTest.php index d91f1c83ef7..b1351f72d30 100644 --- a/tests/Swagger/Serializer/DocumentationNormalizerTest.php +++ b/tests/Swagger/Serializer/DocumentationNormalizerTest.php @@ -382,7 +382,7 @@ public function testNormalizeWithOnlyNormalizationGroups() $documentation = new Documentation(new ResourceNameCollection([Dummy::class]), $title, $description, $version, $formats); $groups = ['dummy', 'foo', 'bar']; - $ref = 'Dummy_'.md5(serialize($groups)); + $ref = 'Dummy_groups_'.implode('_', $groups); $propertyNameCollectionFactoryProphecy = $this->prophesize(PropertyNameCollectionFactoryInterface::class); $propertyNameCollectionFactoryProphecy->create(Dummy::class, ['serializer_groups' => $groups])->shouldBeCalled(1)->willReturn(new PropertyNameCollection(['gerard'])); @@ -697,7 +697,7 @@ public function testNormalizeWithOnlyDenormalizationGroups() 'name' => 'dummy', 'in' => 'body', 'description' => 'The updated Dummy resource', - 'schema' => ['$ref' => '#/definitions/Dummy_be35824b9d92d1dfc6f78fe086649b8f'], + 'schema' => ['$ref' => '#/definitions/Dummy_groups_dummy'], ], ], 'responses' => [ @@ -723,7 +723,7 @@ public function testNormalizeWithOnlyDenormalizationGroups() ]), ], ]), - 'Dummy_be35824b9d92d1dfc6f78fe086649b8f' => new \ArrayObject([ + 'Dummy_groups_dummy' => new \ArrayObject([ 'type' => 'object', 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], @@ -882,13 +882,13 @@ public function testNormalizeWithNormalizationAndDenormalizationGroups() 'name' => 'dummy', 'in' => 'body', 'description' => 'The updated Dummy resource', - 'schema' => ['$ref' => '#/definitions/Dummy_be35824b9d92d1dfc6f78fe086649b8f'], + 'schema' => ['$ref' => '#/definitions/Dummy_groups_dummy'], ], ], 'responses' => [ 200 => [ 'description' => 'Dummy resource updated', - 'schema' => ['$ref' => '#/definitions/Dummy_be35824b9d92d1dfc6f78fe086649b8f'], + 'schema' => ['$ref' => '#/definitions/Dummy_groups_dummy'], ], 400 => ['description' => 'Invalid input'], 404 => ['description' => 'Resource not found'], @@ -908,7 +908,7 @@ public function testNormalizeWithNormalizationAndDenormalizationGroups() ]), ], ]), - 'Dummy_be35824b9d92d1dfc6f78fe086649b8f' => new \ArrayObject([ + 'Dummy_groups_dummy' => new \ArrayObject([ 'type' => 'object', 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], @@ -1136,8 +1136,8 @@ public function testNormalizeWithNestedNormalizationGroups() $version = '1.2.3'; $documentation = new Documentation(new ResourceNameCollection([Dummy::class]), $title, $description, $version, $formats); $groups = ['dummy', 'foo', 'bar']; - $ref = 'Dummy_'.md5(serialize($groups)); - $relatedDummyRef = 'RelatedDummy_'.md5(serialize($groups)); + $ref = 'Dummy_groups_'.implode('_', $groups); + $relatedDummyRef = 'RelatedDummy_groups_'.implode('_', $groups); $propertyNameCollectionFactoryProphecy = $this->prophesize(PropertyNameCollectionFactoryInterface::class); $propertyNameCollectionFactoryProphecy->create(Dummy::class, ['serializer_groups' => $groups])->shouldBeCalled(1)->willReturn(new PropertyNameCollection(['name', 'relatedDummy']));