Skip to content

Commit 7c2c3ec

Browse files
committed
fix(serializer): backport input/output without datatransformers from 3.0
1 parent da30537 commit 7c2c3ec

File tree

17 files changed

+165
-113
lines changed

17 files changed

+165
-113
lines changed

src/Api/IdentifiersExtractor.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,11 @@ public function __construct(ResourceMetadataCollectionFactoryInterface $resource
5656
public function getIdentifiersFromItem($item, Operation $operation = null, array $context = []): array
5757
{
5858
$identifiers = [];
59+
60+
if (!$this->isResourceClass($this->getObjectClass($item))) {
61+
return ['id' => $this->propertyAccessor->getValue($item, 'id')];
62+
}
63+
5964
$resourceClass = $this->getResourceClass($item, true);
6065
$operation = $operation ?? $this->resourceMetadataFactory->create($resourceClass)->getOperation(null, false, true);
6166

@@ -76,6 +81,9 @@ public function getIdentifiersFromItem($item, Operation $operation = null, array
7681
continue;
7782
}
7883

84+
if (!$link->getParameterName()) {
85+
dd($operation);
86+
}
7987
$identifiers[$link->getParameterName()] = $this->getIdentifierValue($item, $link->getFromClass(), $link->getIdentifiers()[0], $link->getParameterName());
8088
}
8189

src/GraphQl/Serializer/ItemNormalizer.php

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -71,22 +71,28 @@ public function supportsNormalization($data, $format = null, array $context = []
7171
*/
7272
public function normalize($object, $format = null, array $context = [])
7373
{
74-
if (isset($context['operation_name'])) {
75-
unset($context['operation_name']);
76-
}
74+
$resourceClass = $this->getObjectClass($object);
75+
76+
if ($outputClass = $this->getOutputClass($resourceClass, $context)) {
77+
$context['graphql_identifiers'] = [
78+
self::ITEM_RESOURCE_CLASS_KEY => $context['operation']->getClass(),
79+
self::ITEM_IDENTIFIERS_KEY => $this->identifiersExtractor->getIdentifiersFromItem($object),
80+
];
7781

78-
if (null !== $this->getOutputClass($this->getObjectClass($object), $context)) {
7982
return parent::normalize($object, $format, $context);
8083
}
8184

85+
unset($context['operation_name'], $context['operation']);
8286
$data = parent::normalize($object, $format, $context);
8387
if (!\is_array($data)) {
8488
throw new UnexpectedValueException('Expected data to be an array.');
8589
}
8690

87-
if (!($context['no_resolver_data'] ?? false)) {
88-
$data[self::ITEM_RESOURCE_CLASS_KEY] = $this->getObjectClass($object);
89-
$data[self::ITEM_IDENTIFIERS_KEY] = $this->identifiersExtractor->getIdentifiersFromItem($object);
91+
if (isset($context['graphql_identifiers'])) {
92+
$data = $data + $context['graphql_identifiers'];
93+
} elseif (!($context['no_resolver_data'] ?? false)) {
94+
$data[self::ITEM_RESOURCE_CLASS_KEY] = $resourceClass;
95+
$data[self::ITEM_IDENTIFIERS_KEY] = $this->identifiersExtractor->getIdentifiersFromItem($object, $context['operation'] ?? null);
9096
}
9197

9298
return $data;
@@ -104,7 +110,7 @@ protected function normalizeCollectionOfRelations($propertyMetadata, $attributeV
104110
/**
105111
* {@inheritdoc}
106112
*/
107-
public function supportsDenormalization($data, $type, $format = null, array $context = []): bool
113+
public function supportsDenormalization($data, $type, $format = null, array $context = [])
108114
{
109115
return self::FORMAT === $format && parent::supportsDenormalization($data, $type, $format, $context);
110116
}

src/GraphQl/Type/TypeBuilder.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,8 @@ public function getResourceObjectType(?string $resourceClass, ResourceMetadataCo
115115
'resolveField' => $this->defaultFieldResolver,
116116
'fields' => function () use ($resourceClass, $operation, $operationName, $resourceMetadataCollection, $input, $wrapData, $depth, $ioMetadata) {
117117
if ($wrapData) {
118-
$queryNormalizationContext = $this->getQueryOperation($resourceMetadataCollection)?->getNormalizationContext() ?? [];
118+
$queryOperation = $this->getQueryOperation($resourceMetadataCollection);
119+
$queryNormalizationContext = $queryOperation ? ($queryOperation->getNormalizationContext() ?? []) : [];
119120

120121
try {
121122
$mutationNormalizationContext = $operation instanceof Mutation || $operation instanceof Subscription ? ($resourceMetadataCollection->getOperation($operationName)->getNormalizationContext() ?? []) : [];

src/Hal/Serializer/ItemNormalizer.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,15 +56,19 @@ public function supportsNormalization($data, $format = null, array $context = []
5656
*/
5757
public function normalize($object, $format = null, array $context = [])
5858
{
59-
if (null !== $this->getOutputClass($this->getObjectClass($object), $context)) {
59+
$resourceClass = $this->getObjectClass($object);
60+
if ($this->getOutputClass($resourceClass, $context)) {
6061
return parent::normalize($object, $format, $context);
6162
}
6263

6364
if (!isset($context['cache_key'])) {
6465
$context['cache_key'] = $this->getCacheKey($format, $context);
6566
}
6667

67-
$resourceClass = $this->resourceClassResolver->getResourceClass($object, $context['resource_class'] ?? null);
68+
if ($this->resourceClassResolver->isResourceClass($resourceClass)) {
69+
$resourceClass = $this->resourceClassResolver->getResourceClass($object, $context['resource_class'] ?? null);
70+
}
71+
6872
$context = $this->initContext($resourceClass, $context);
6973
$iri = $this->iriConverter instanceof LegacyIriConverterInterface ? $this->iriConverter->getIriFromItem($object) : $this->iriConverter->getIriFromResource($object);
7074
$context['iri'] = $iri;

src/JsonApi/Serializer/ItemNormalizer.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,15 +72,19 @@ public function supportsNormalization($data, $format = null, array $context = []
7272
*/
7373
public function normalize($object, $format = null, array $context = [])
7474
{
75-
if (null !== $this->getOutputClass($this->getObjectClass($object), $context)) {
75+
$resourceClass = $this->getObjectClass($object);
76+
if ($this->getOutputClass($resourceClass, $context)) {
7677
return parent::normalize($object, $format, $context);
7778
}
7879

7980
if (!isset($context['cache_key'])) {
8081
$context['cache_key'] = $this->getCacheKey($format, $context);
8182
}
8283

83-
$resourceClass = $this->resourceClassResolver->getResourceClass($object, $context['resource_class'] ?? null);
84+
if ($isResourceClass = $this->resourceClassResolver->isResourceClass($resourceClass)) {
85+
$resourceClass = $this->resourceClassResolver->getResourceClass($object, $context['resource_class'] ?? null);
86+
}
87+
8488
$context = $this->initContext($resourceClass, $context);
8589
$iri = $this->iriConverter instanceof LegacyIriConverterInterface ? $this->iriConverter->getIriFromItem($object) : $this->iriConverter->getIriFromResource($object);
8690
$context['iri'] = $iri;

src/JsonLd/Serializer/ItemNormalizer.php

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
use ApiPlatform\Core\Api\IriConverterInterface as LegacyIriConverterInterface;
2020
use ApiPlatform\Core\Metadata\Property\Factory\PropertyNameCollectionFactoryInterface;
2121
use ApiPlatform\Core\Metadata\Resource\Factory\ResourceMetadataFactoryInterface;
22+
use ApiPlatform\JsonLd\AnonymousContextBuilderInterface;
2223
use ApiPlatform\JsonLd\ContextBuilderInterface;
2324
use ApiPlatform\Metadata\HttpOperation;
2425
use ApiPlatform\Serializer\AbstractItemNormalizer;
@@ -74,17 +75,23 @@ public function supportsNormalization($data, $format = null, array $context = []
7475
*/
7576
public function normalize($object, $format = null, array $context = [])
7677
{
77-
$objectClass = $this->getObjectClass($object);
78-
$outputClass = $this->getOutputClass($objectClass, $context);
79-
if (null !== $outputClass && !isset($context[self::IS_TRANSFORMED_TO_SAME_CLASS])) {
78+
$resourceClass = $this->getObjectClass($object);
79+
80+
if ($outputClass = $this->getOutputClass($resourceClass, $context) && !isset($context[self::IS_TRANSFORMED_TO_SAME_CLASS])) {
8081
return parent::normalize($object, $format, $context);
8182
}
8283

8384
// TODO: we should not remove the resource_class in the normalizeRawCollection as we would find out anyway that it's not the same as the requested one
8485
$previousResourceClass = $context['resource_class'] ?? null;
85-
$resourceClass = $this->resourceClassResolver->getResourceClass($object, $context['resource_class'] ?? null);
86-
$context = $this->initContext($resourceClass, $context);
87-
$metadata = $this->addJsonLdContext($this->contextBuilder, $resourceClass, $context);
86+
$metadata = [];
87+
if ($isResourceClass = $this->resourceClassResolver->isResourceClass($resourceClass)) {
88+
$resourceClass = $this->resourceClassResolver->getResourceClass($object, $resourceClass);
89+
$context = $this->initContext($resourceClass, $context);
90+
$metadata = $this->addJsonLdContext($this->contextBuilder, $resourceClass, $context);
91+
} elseif ($this->contextBuilder instanceof AnonymousContextBuilderInterface) {
92+
// We should improve what's behind the context creation, its probably more complicated then it should
93+
$metadata = $this->createJsonLdContext($this->contextBuilder, $object, $context);
94+
}
8895

8996
if (isset($context['operation']) && $previousResourceClass !== $resourceClass) {
9097
unset($context['operation'], $context['operation_name']);
@@ -96,8 +103,11 @@ public function normalize($object, $format = null, array $context = [])
96103
$iri = $this->iriConverter->getIriFromResource($object, UrlGeneratorInterface::ABS_PATH, $context['operation'] ?? null, $context);
97104
}
98105

99-
$context['iri'] = $iri;
100-
$metadata['@id'] = $iri;
106+
if (isset($iri)) {
107+
$context['iri'] = $iri;
108+
$metadata['@id'] = $iri;
109+
}
110+
101111
$context['api_normalize'] = true;
102112

103113
$data = parent::normalize($object, $format, $context);

src/Metadata/Resource/Factory/UriTemplateResourceMetadataCollectionFactory.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,11 @@ private function configureUriVariables($operation)
126126
[] === $operation->getUriVariables() ||
127127
($operation instanceof CollectionOperationInterface && null === $operation->getUriTemplate())
128128
)) {
129-
return $operation;
129+
if (null === $operation->getUriVariables()) {
130+
return $operation;
131+
}
132+
133+
return $this->normalizeUriVariables($operation);
130134
}
131135

132136
if (!$operation->getUriVariables()) {
@@ -178,6 +182,7 @@ private function configureUriVariables($operation)
178182
private function normalizeUriVariables($operation)
179183
{
180184
$uriVariables = (array) ($operation->getUriVariables() ?? []);
185+
181186
$normalizedUriVariables = [];
182187
$resourceClass = $operation->getClass();
183188

0 commit comments

Comments
 (0)