diff --git a/src/Metadata/Resource/Factory/AnnotationResourceMetadataFactory.php b/src/Metadata/Resource/Factory/AnnotationResourceMetadataFactory.php index cc9bc054499..f6efada1fab 100644 --- a/src/Metadata/Resource/Factory/AnnotationResourceMetadataFactory.php +++ b/src/Metadata/Resource/Factory/AnnotationResourceMetadataFactory.php @@ -88,7 +88,15 @@ private function handleNotFound(?ResourceMetadata $parentPropertyMetadata, strin private function createMetadata(ApiResource $annotation, ResourceMetadata $parentResourceMetadata = null): ResourceMetadata { - $attributes = (null === $annotation->attributes && [] === $this->defaults['attributes']) ? null : (array) $annotation->attributes + $this->defaults['attributes']; + $attributes = null; + if (null !== $annotation->attributes || [] !== $this->defaults['attributes']) { + $attributes = (array) $annotation->attributes; + foreach ($this->defaults['attributes'] as $key => $value) { + if (!isset($attributes[$key])) { + $attributes[$key] = $value; + } + } + } if (!$parentResourceMetadata) { return new ResourceMetadata( diff --git a/src/Metadata/Resource/Factory/ExtractorResourceMetadataFactory.php b/src/Metadata/Resource/Factory/ExtractorResourceMetadataFactory.php index fee663cf97c..456fb9e5cc7 100644 --- a/src/Metadata/Resource/Factory/ExtractorResourceMetadataFactory.php +++ b/src/Metadata/Resource/Factory/ExtractorResourceMetadataFactory.php @@ -59,7 +59,15 @@ public function create(string $resourceClass): ResourceMetadata $resource['itemOperations'] = $resource['itemOperations'] ?? $this->defaults['item_operations'] ?? null; $resource['collectionOperations'] = $resource['collectionOperations'] ?? $this->defaults['collection_operations'] ?? null; $resource['graphql'] = $resource['graphql'] ?? $this->defaults['graphql'] ?? null; - $resource['attributes'] = (null === $resource['attributes'] && [] === $this->defaults['attributes']) ? null : (array) $resource['attributes'] + $this->defaults['attributes']; + + if (null !== $resource['attributes'] || [] !== $this->defaults['attributes']) { + $resource['attributes'] = (array) $resource['attributes']; + foreach ($this->defaults['attributes'] as $key => $value) { + if (!isset($resource['attributes'][$key])) { + $resource['attributes'][$key] = $value; + } + } + } return $this->update($parentResourceMetadata ?: new ResourceMetadata(), $resource); } diff --git a/tests/Metadata/Resource/Factory/AnnotationResourceMetadataFactoryTest.php b/tests/Metadata/Resource/Factory/AnnotationResourceMetadataFactoryTest.php index caeb6fb60c6..c06f1e0c0a8 100644 --- a/tests/Metadata/Resource/Factory/AnnotationResourceMetadataFactoryTest.php +++ b/tests/Metadata/Resource/Factory/AnnotationResourceMetadataFactoryTest.php @@ -80,6 +80,7 @@ public function testCreateWithDefaults() 'attributes' => [ 'pagination_client_enabled' => true, 'pagination_maximum_items_per_page' => 10, + 'stateless' => null, ], ]); $reader = $this->prophesize(Reader::class); diff --git a/tests/Metadata/Resource/Factory/ExtractorResourceMetadataFactoryTest.php b/tests/Metadata/Resource/Factory/ExtractorResourceMetadataFactoryTest.php index a5d1dbc552e..07f700a8d68 100644 --- a/tests/Metadata/Resource/Factory/ExtractorResourceMetadataFactoryTest.php +++ b/tests/Metadata/Resource/Factory/ExtractorResourceMetadataFactoryTest.php @@ -312,6 +312,7 @@ public function testItFallbacksToDefaultConfiguration() 'subresourceOperations' => null, 'itemOperations' => ['get', 'delete'], 'attributes' => [ + 'pagination_items_per_page' => null, 'pagination_maximum_items_per_page' => 10, 'stateless' => false, ],