Skip to content

Commit 1ee9be8

Browse files
authored
Merge pull request #2566 from soyuka/fix-itemnormalizer
Use the ItemNormalizer in the correct context
2 parents 9d916da + e3d527d commit 1ee9be8

File tree

12 files changed

+47
-34
lines changed

12 files changed

+47
-34
lines changed

src/GraphQl/Serializer/ItemNormalizer.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ final class ItemNormalizer extends BaseItemNormalizer
2929
/**
3030
* {@inheritdoc}
3131
*/
32-
public function supportsNormalization($data, $format = null)
32+
public function supportsNormalization($data, $format = null, array $context = [])
3333
{
34-
return self::FORMAT === $format && parent::supportsNormalization($data, $format);
34+
return self::FORMAT === $format && parent::supportsNormalization($data, $format, $context);
3535
}
3636

3737
/**

src/Hal/Serializer/ItemNormalizer.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ final class ItemNormalizer extends AbstractItemNormalizer
3838
/**
3939
* {@inheritdoc}
4040
*/
41-
public function supportsNormalization($data, $format = null)
41+
public function supportsNormalization($data, $format = null, array $context = [])
4242
{
43-
return self::FORMAT === $format && parent::supportsNormalization($data, $format);
43+
return self::FORMAT === $format && parent::supportsNormalization($data, $format, $context);
4444
}
4545

4646
/**

src/JsonApi/Serializer/ItemNormalizer.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,9 @@ public function __construct(PropertyNameCollectionFactoryInterface $propertyName
4949
/**
5050
* {@inheritdoc}
5151
*/
52-
public function supportsNormalization($data, $format = null)
52+
public function supportsNormalization($data, $format = null, array $context = [])
5353
{
54-
return self::FORMAT === $format && parent::supportsNormalization($data, $format);
54+
return self::FORMAT === $format && parent::supportsNormalization($data, $format, $context);
5555
}
5656

5757
/**

src/JsonLd/Serializer/ItemNormalizer.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,9 @@ public function __construct(ResourceMetadataFactoryInterface $resourceMetadataFa
5252
/**
5353
* {@inheritdoc}
5454
*/
55-
public function supportsNormalization($data, $format = null)
55+
public function supportsNormalization($data, $format = null, array $context = [])
5656
{
57-
return self::FORMAT === $format && parent::supportsNormalization($data, $format);
57+
return self::FORMAT === $format && parent::supportsNormalization($data, $format, $context);
5858
}
5959

6060
/**

src/Serializer/AbstractItemNormalizer.php

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,16 @@
1515

1616
use ApiPlatform\Core\Api\IriConverterInterface;
1717
use ApiPlatform\Core\Api\ResourceClassResolverInterface;
18-
use ApiPlatform\Core\Bridge\Elasticsearch\Serializer\ItemNormalizer;
18+
use ApiPlatform\Core\Bridge\Elasticsearch\Serializer\ItemNormalizer as ElasticsearchItemNormalizer;
1919
use ApiPlatform\Core\DataProvider\ItemDataProviderInterface;
2020
use ApiPlatform\Core\DataTransformer\DataTransformerInterface;
2121
use ApiPlatform\Core\Exception\InvalidArgumentException;
2222
use ApiPlatform\Core\Exception\InvalidValueException;
2323
use ApiPlatform\Core\Exception\ItemNotFoundException;
24+
use ApiPlatform\Core\GraphQl\Serializer\ItemNormalizer as GraphQlItemNormalizer;
25+
use ApiPlatform\Core\Hal\Serializer\ItemNormalizer as HalItemNormalizer;
26+
use ApiPlatform\Core\JsonApi\Serializer\ItemNormalizer as JsonApiItemNormalizer;
27+
use ApiPlatform\Core\JsonLd\Serializer\ItemNormalizer as JsonLdItemNormalizer;
2428
use ApiPlatform\Core\Metadata\Property\Factory\PropertyMetadataFactoryInterface;
2529
use ApiPlatform\Core\Metadata\Property\Factory\PropertyNameCollectionFactoryInterface;
2630
use ApiPlatform\Core\Metadata\Property\PropertyMetadata;
@@ -36,6 +40,7 @@
3640
use Symfony\Component\Serializer\NameConverter\AdvancedNameConverterInterface;
3741
use Symfony\Component\Serializer\NameConverter\NameConverterInterface;
3842
use Symfony\Component\Serializer\Normalizer\AbstractObjectNormalizer;
43+
use Symfony\Component\Serializer\Normalizer\ContextAwareNormalizerInterface;
3944
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
4045
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
4146

@@ -44,8 +49,11 @@
4449
*
4550
* @author Kévin Dunglas <[email protected]>
4651
*/
47-
abstract class AbstractItemNormalizer extends AbstractObjectNormalizer
52+
abstract class AbstractItemNormalizer extends AbstractObjectNormalizer implements ContextAwareNormalizerInterface
4853
{
54+
private const FORMATS = [GraphQlItemNormalizer::FORMAT, HalItemNormalizer::FORMAT, JsonApiItemNormalizer::FORMAT, JsonLdItemNormalizer::FORMAT];
55+
const USE_API_PLATFORM = 'use_api_platform';
56+
4957
use ClassInfoTrait;
5058
use ContextTrait;
5159
use InputOutputMetadataTrait;
@@ -93,8 +101,12 @@ public function __construct(PropertyNameCollectionFactoryInterface $propertyName
93101
/**
94102
* {@inheritdoc}
95103
*/
96-
public function supportsNormalization($data, $format = null)
104+
public function supportsNormalization($data, $format = null, array $context = [])
97105
{
106+
if (!(($context[static::USE_API_PLATFORM] ?? false) || \in_array($format, self::FORMATS, true))) {
107+
return false;
108+
}
109+
98110
if (!\is_object($data) || $data instanceof \Traversable) {
99111
return false;
100112
}
@@ -111,7 +123,7 @@ public function supportsNormalization($data, $format = null)
111123
*/
112124
public function hasCacheableSupportsMethod(): bool
113125
{
114-
return true;
126+
return false;
115127
}
116128

117129
/**
@@ -144,7 +156,7 @@ public function normalize($object, $format = null, array $context = [])
144156
*/
145157
public function supportsDenormalization($data, $type, $format = null)
146158
{
147-
if (ItemNormalizer::FORMAT === $format) {
159+
if (ElasticsearchItemNormalizer::FORMAT === $format) {
148160
return false;
149161
}
150162

src/Serializer/SerializerContextBuilder.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ public function createFromRequest(Request $request, bool $normalization, array $
5757
}
5858

5959
$context = $resourceMetadata->getTypedOperationAttribute($operationType, $attributes[$operationKey], $key, [], true);
60+
$context[AbstractItemNormalizer::USE_API_PLATFORM] = true;
6061
$context['operation_type'] = $operationType;
6162
$context[$operationKey] = $attributes[$operationKey];
6263

tests/Hal/Serializer/ItemNormalizerTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ public function testSupportsNormalization()
100100
$this->assertTrue($normalizer->supportsNormalization($dummy, 'jsonhal'));
101101
$this->assertFalse($normalizer->supportsNormalization($dummy, 'xml'));
102102
$this->assertFalse($normalizer->supportsNormalization($std, 'jsonhal'));
103-
$this->assertTrue($normalizer->hasCacheableSupportsMethod());
103+
$this->assertFalse($normalizer->hasCacheableSupportsMethod());
104104
}
105105

106106
public function testNormalize()

tests/Hydra/Serializer/ItemNormalizerTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public function testDontSupportDenormalization()
5252
$normalizer = new ItemNormalizer($resourceMetadataFactoryProphecy->reveal(), $propertyNameCollectionFactoryProphecy->reveal(), $propertyMetadataFactoryProphecy->reveal(), $iriConverterProphecy->reveal(), $resourceClassResolverProphecy->reveal(), $contextBuilderProphecy->reveal());
5353

5454
$this->assertFalse($normalizer->supportsDenormalization('foo', ItemNormalizer::FORMAT));
55-
$this->assertTrue($normalizer->hasCacheableSupportsMethod());
55+
$this->assertFalse($normalizer->hasCacheableSupportsMethod());
5656
}
5757

5858
/**
@@ -87,7 +87,7 @@ public function testSupportNormalization()
8787
$this->assertTrue($normalizer->supportsNormalization($dummy, 'jsonld'));
8888
$this->assertFalse($normalizer->supportsNormalization($dummy, 'xml'));
8989
$this->assertFalse($normalizer->supportsNormalization($std, 'jsonld'));
90-
$this->assertTrue($normalizer->hasCacheableSupportsMethod());
90+
$this->assertFalse($normalizer->hasCacheableSupportsMethod());
9191
}
9292

9393
public function testNormalize()

tests/JsonApi/Serializer/ItemNormalizerTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public function testSupportDenormalization()
6565

6666
$this->assertTrue($normalizer->supportsDenormalization(null, Dummy::class, ItemNormalizer::FORMAT));
6767
$this->assertFalse($normalizer->supportsDenormalization(null, \stdClass::class, ItemNormalizer::FORMAT));
68-
$this->assertTrue($normalizer->hasCacheableSupportsMethod());
68+
$this->assertFalse($normalizer->hasCacheableSupportsMethod());
6969
}
7070

7171
/**

tests/Serializer/AbstractItemNormalizerTest.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,11 +76,11 @@ public function testLegacySupportNormalizationAndSupportDenormalization()
7676
$propertyAccessorProphecy->reveal(),
7777
]);
7878

79-
$this->assertTrue($normalizer->supportsNormalization($dummy));
80-
$this->assertFalse($normalizer->supportsNormalization($std));
79+
$this->assertTrue($normalizer->supportsNormalization($dummy, null, [AbstractItemNormalizer::USE_API_PLATFORM => true]));
80+
$this->assertFalse($normalizer->supportsNormalization($std, null, [AbstractItemNormalizer::USE_API_PLATFORM => true]));
8181
$this->assertTrue($normalizer->supportsDenormalization($dummy, Dummy::class));
8282
$this->assertFalse($normalizer->supportsDenormalization($std, \stdClass::class));
83-
$this->assertTrue($normalizer->hasCacheableSupportsMethod());
83+
$this->assertFalse($normalizer->hasCacheableSupportsMethod());
8484
}
8585

8686
public function testSupportNormalizationAndSupportDenormalization()
@@ -111,11 +111,11 @@ public function testSupportNormalizationAndSupportDenormalization()
111111
true,
112112
]);
113113

114-
$this->assertTrue($normalizer->supportsNormalization($dummy));
115-
$this->assertTrue($normalizer->supportsNormalization($std));
114+
$this->assertTrue($normalizer->supportsNormalization($dummy, null, [AbstractItemNormalizer::USE_API_PLATFORM => true]));
115+
$this->assertTrue($normalizer->supportsNormalization($std, null, [AbstractItemNormalizer::USE_API_PLATFORM => true]));
116116
$this->assertTrue($normalizer->supportsDenormalization($dummy, Dummy::class));
117117
$this->assertTrue($normalizer->supportsDenormalization($std, \stdClass::class));
118-
$this->assertTrue($normalizer->hasCacheableSupportsMethod());
118+
$this->assertFalse($normalizer->hasCacheableSupportsMethod());
119119
}
120120

121121
public function testNormalize()

0 commit comments

Comments
 (0)