Skip to content

Commit 3c73221

Browse files
alanpoulaindunglas
authored andcommitted
[GraphQL] Fix identifiers (#1805)
* Remove final from ItemNormalizer (add a PHPDoc final instead) * Modify GraphQL item normalizer to manage identifiers correctly * Remove uneeded code in mutation resolver
1 parent bc2be71 commit 3c73221

File tree

3 files changed

+37
-12
lines changed

3 files changed

+37
-12
lines changed

src/GraphQl/Resolver/Factory/ItemMutationResolverFactory.php

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -85,11 +85,6 @@ public function __invoke(string $resourceClass = null, string $rootClass = null,
8585
switch ($operationName) {
8686
case 'create':
8787
case 'update':
88-
unset($args['input']['id']);
89-
if (isset($args['input']['_id'])) {
90-
$args['input']['id'] = $args['input']['_id'];
91-
}
92-
9388
$context = null === $item ? ['resource_class' => $resourceClass] : ['resource_class' => $resourceClass, 'object_to_populate' => $item];
9489
$item = $this->normalizer->denormalize($args['input'], $resourceClass, ItemNormalizer::FORMAT, $context);
9590
$this->validate($item, $info, $resourceMetadata, $operationName);

src/GraphQl/Serializer/ItemNormalizer.php

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,23 +23,32 @@
2323

2424
use ApiPlatform\Core\Metadata\Property\PropertyMetadata;
2525
use ApiPlatform\Core\Serializer\AbstractItemNormalizer;
26+
use ApiPlatform\Core\Serializer\ItemNormalizer as BaseItemNormalizer;
2627

2728
/**
2829
* GraphQL normalizer.
2930
*
3031
* @author Kévin Dunglas <[email protected]>
3132
*/
32-
final class ItemNormalizer extends AbstractItemNormalizer
33+
final class ItemNormalizer extends BaseItemNormalizer
3334
{
3435
const FORMAT = 'graphql';
3536
const ITEM_KEY = '#item';
3637

38+
/**
39+
* {@inheritdoc}
40+
*/
41+
public function supportsNormalization($data, $format = null)
42+
{
43+
return self::FORMAT === $format && parent::supportsNormalization($data, $format);
44+
}
45+
3746
/**
3847
* {@inheritdoc}
3948
*/
4049
public function normalize($object, $format = null, array $context = [])
4150
{
42-
$data = parent::normalize($object, $format, $context);
51+
$data = AbstractItemNormalizer::normalize($object, $format, $context);
4352
$data[self::ITEM_KEY] = serialize($object); // calling serialize prevent weird normalization process done by Webonyx's GraphQL PHP
4453

4554
return $data;
@@ -57,16 +66,35 @@ protected function normalizeCollectionOfRelations(PropertyMetadata $propertyMeta
5766
/**
5867
* {@inheritdoc}
5968
*/
60-
public function supportsNormalization($data, $format = null)
69+
public function supportsDenormalization($data, $type, $format = null)
6170
{
62-
return self::FORMAT === $format && parent::supportsNormalization($data, $format);
71+
return self::FORMAT === $format && parent::supportsDenormalization($data, $type, $format);
6372
}
6473

6574
/**
6675
* {@inheritdoc}
6776
*/
68-
public function supportsDenormalization($data, $type, $format = null)
77+
protected function getAllowedAttributes($classOrObject, array $context, $attributesAsString = false)
6978
{
70-
return self::FORMAT === $format && parent::supportsDenormalization($data, $type, $format);
79+
$allowedAttributes = parent::getAllowedAttributes($classOrObject, $context, $attributesAsString);
80+
81+
if (($context['api_denormalize'] ?? false) && false !== ($indexId = array_search('id', $allowedAttributes, true))) {
82+
$allowedAttributes[] = '_id';
83+
array_splice($allowedAttributes, $indexId, 1);
84+
}
85+
86+
return $allowedAttributes;
87+
}
88+
89+
/**
90+
* {@inheritdoc}
91+
*/
92+
protected function setAttributeValue($object, $attribute, $value, $format = null, array $context = [])
93+
{
94+
if ('_id' === $attribute) {
95+
$attribute = 'id';
96+
}
97+
98+
parent::setAttributeValue($object, $attribute, $value, $format, $context);
7199
}
72100
}

src/Serializer/ItemNormalizer.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,11 @@
1818
/**
1919
* Generic item normalizer.
2020
*
21+
* @final
22+
*
2123
* @author Kévin Dunglas <[email protected]>
2224
*/
23-
final class ItemNormalizer extends AbstractItemNormalizer
25+
class ItemNormalizer extends AbstractItemNormalizer
2426
{
2527
/**
2628
* {@inheritdoc}

0 commit comments

Comments
 (0)