Skip to content

Commit 2f94606

Browse files
Merge branch '5.4' into 6.0
* 5.4: [Security] Fix AuthenticationTrustResolver::isAnonymous() [Serializer] Return an ArrayObject for empty collection objects when PRESERVE_EMPTY_OBJECTS is set
2 parents 2967aaa + 81c2007 commit 2f94606

File tree

3 files changed

+9
-69
lines changed

3 files changed

+9
-69
lines changed

src/Symfony/Component/Serializer/CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ CHANGELOG
1212

1313
* Add support of PHP backed enumerations
1414
* Add support for serializing empty array as object
15-
* Deprecate support for returning empty, iterable, countable, raw object when normalizing
15+
* Return empty collections as `ArrayObject` from `Serializer::normalize()` when `PRESERVE_EMPTY_OBJECTS` is set
1616

1717
5.3
1818
---

src/Symfony/Component/Serializer/Serializer.php

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -164,18 +164,13 @@ public function normalize(mixed $data, string $format = null, array $context = [
164164
return $data;
165165
}
166166

167+
if (\is_array($data) && !$data && ($context[self::EMPTY_ARRAY_AS_OBJECT] ?? false)) {
168+
return new \ArrayObject();
169+
}
170+
167171
if (is_iterable($data)) {
168-
if (is_countable($data) && 0 === \count($data)) {
169-
switch (true) {
170-
case ($context[AbstractObjectNormalizer::PRESERVE_EMPTY_OBJECTS] ?? false) && \is_object($data):
171-
if (!$data instanceof \ArrayObject) {
172-
trigger_deprecation('symfony/serializer', '5.4', 'Returning empty object of class "%s" from "%s()" is deprecated. This class should extend "ArrayObject".', get_debug_type($data), __METHOD__);
173-
}
174-
175-
return $data;
176-
case ($context[self::EMPTY_ARRAY_AS_OBJECT] ?? false) && \is_array($data):
177-
return new \ArrayObject();
178-
}
172+
if ($data instanceof \Countable && ($context[AbstractObjectNormalizer::PRESERVE_EMPTY_OBJECTS] ?? false) && !\count($data)) {
173+
return new \ArrayObject();
179174
}
180175

181176
$normalized = [];

src/Symfony/Component/Serializer/Tests/SerializerTest.php

Lines changed: 2 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -581,7 +581,7 @@ public function testNormalizeWithCollection(Serializer $serializer, array $data)
581581
/** @dataProvider provideObjectOrCollectionTests */
582582
public function testNormalizePreserveEmptyArrayObject(Serializer $serializer, array $data)
583583
{
584-
$expected = '{"a1":{},"a2":{"k":"v"},"b1":[],"b2":{"k":"v"},"c1":{"nested":{}},"c2":{"nested":{"k":"v"}},"d1":{"nested":[]},"d2":{"nested":{"k":"v"}},"e1":{"map":[]},"e2":{"map":{"k":"v"}},"f1":{"map":{}},"f2":{"map":{"k":"v"}},"g1":{"list":{"list":[]},"settings":[]},"g2":{"list":["greg"],"settings":[]}}';
584+
$expected = '{"a1":{},"a2":{"k":"v"},"b1":[],"b2":{"k":"v"},"c1":{"nested":{}},"c2":{"nested":{"k":"v"}},"d1":{"nested":[]},"d2":{"nested":{"k":"v"}},"e1":{"map":[]},"e2":{"map":{"k":"v"}},"f1":{"map":{}},"f2":{"map":{"k":"v"}},"g1":{"list":{},"settings":[]},"g2":{"list":["greg"],"settings":[]}}';
585585
$this->assertSame($expected, $serializer->serialize($data, 'json', [
586586
AbstractObjectNormalizer::PRESERVE_EMPTY_OBJECTS => true,
587587
]));
@@ -599,62 +599,7 @@ public function testNormalizeEmptyArrayAsObject(Serializer $serializer, array $d
599599
/** @dataProvider provideObjectOrCollectionTests */
600600
public function testNormalizeEmptyArrayAsObjectAndPreserveEmptyArrayObject(Serializer $serializer, array $data)
601601
{
602-
$expected = '{"a1":{},"a2":{"k":"v"},"b1":{},"b2":{"k":"v"},"c1":{"nested":{}},"c2":{"nested":{"k":"v"}},"d1":{"nested":{}},"d2":{"nested":{"k":"v"}},"e1":{"map":{}},"e2":{"map":{"k":"v"}},"f1":{"map":{}},"f2":{"map":{"k":"v"}},"g1":{"list":{"list":[]},"settings":{}},"g2":{"list":["greg"],"settings":{}}}';
603-
$this->assertSame($expected, $serializer->serialize($data, 'json', [
604-
Serializer::EMPTY_ARRAY_AS_OBJECT => true,
605-
AbstractObjectNormalizer::PRESERVE_EMPTY_OBJECTS => true,
606-
]));
607-
}
608-
609-
/**
610-
* @dataProvider provideObjectOrCollectionTests
611-
* @group legacy
612-
*/
613-
public function testNormalizeWithCollectionLegacy(Serializer $serializer, array $data)
614-
{
615-
$data['g1'] = new BazLegacy([]);
616-
$data['g2'] = new BazLegacy(['greg']);
617-
$expected = '{"a1":[],"a2":{"k":"v"},"b1":[],"b2":{"k":"v"},"c1":{"nested":[]},"c2":{"nested":{"k":"v"}},"d1":{"nested":[]},"d2":{"nested":{"k":"v"}},"e1":{"map":[]},"e2":{"map":{"k":"v"}},"f1":{"map":[]},"f2":{"map":{"k":"v"}},"g1":{"list":[],"settings":[]},"g2":{"list":["greg"],"settings":[]}}';
618-
$this->assertSame($expected, $serializer->serialize($data, 'json'));
619-
}
620-
621-
/**
622-
* @dataProvider provideObjectOrCollectionTests
623-
* @group legacy
624-
*/
625-
public function testNormalizePreserveEmptyArrayObjectLegacy(Serializer $serializer, array $data)
626-
{
627-
$data['g1'] = new BazLegacy([]);
628-
$data['g2'] = new BazLegacy(['greg']);
629-
$expected = '{"a1":{},"a2":{"k":"v"},"b1":[],"b2":{"k":"v"},"c1":{"nested":{}},"c2":{"nested":{"k":"v"}},"d1":{"nested":[]},"d2":{"nested":{"k":"v"}},"e1":{"map":[]},"e2":{"map":{"k":"v"}},"f1":{"map":{}},"f2":{"map":{"k":"v"}},"g1":{"list":{"list":[]},"settings":[]},"g2":{"list":["greg"],"settings":[]}}';
630-
$this->assertSame($expected, $serializer->serialize($data, 'json', [
631-
AbstractObjectNormalizer::PRESERVE_EMPTY_OBJECTS => true,
632-
]));
633-
}
634-
635-
/**
636-
* @dataProvider provideObjectOrCollectionTests
637-
* @group legacy
638-
*/
639-
public function testNormalizeEmptyArrayAsObjectLegacy(Serializer $serializer, array $data)
640-
{
641-
$data['g1'] = new BazLegacy([]);
642-
$data['g2'] = new BazLegacy(['greg']);
643-
$expected = '{"a1":[],"a2":{"k":"v"},"b1":{},"b2":{"k":"v"},"c1":{"nested":[]},"c2":{"nested":{"k":"v"}},"d1":{"nested":{}},"d2":{"nested":{"k":"v"}},"e1":{"map":{}},"e2":{"map":{"k":"v"}},"f1":{"map":[]},"f2":{"map":{"k":"v"}},"g1":{"list":[],"settings":{}},"g2":{"list":["greg"],"settings":{}}}';
644-
$this->assertSame($expected, $serializer->serialize($data, 'json', [
645-
Serializer::EMPTY_ARRAY_AS_OBJECT => true,
646-
]));
647-
}
648-
649-
/**
650-
* @dataProvider provideObjectOrCollectionTests
651-
* @group legacy
652-
*/
653-
public function testNormalizeEmptyArrayAsObjectAndPreserveEmptyArrayObjectLegacy(Serializer $serializer, array $data)
654-
{
655-
$data['g1'] = new BazLegacy([]);
656-
$data['g2'] = new BazLegacy(['greg']);
657-
$expected = '{"a1":{},"a2":{"k":"v"},"b1":{},"b2":{"k":"v"},"c1":{"nested":{}},"c2":{"nested":{"k":"v"}},"d1":{"nested":{}},"d2":{"nested":{"k":"v"}},"e1":{"map":{}},"e2":{"map":{"k":"v"}},"f1":{"map":{}},"f2":{"map":{"k":"v"}},"g1":{"list":{"list":[]},"settings":{}},"g2":{"list":["greg"],"settings":{}}}';
602+
$expected = '{"a1":{},"a2":{"k":"v"},"b1":{},"b2":{"k":"v"},"c1":{"nested":{}},"c2":{"nested":{"k":"v"}},"d1":{"nested":{}},"d2":{"nested":{"k":"v"}},"e1":{"map":{}},"e2":{"map":{"k":"v"}},"f1":{"map":{}},"f2":{"map":{"k":"v"}},"g1":{"list":{},"settings":{}},"g2":{"list":["greg"],"settings":{}}}';
658603
$this->assertSame($expected, $serializer->serialize($data, 'json', [
659604
Serializer::EMPTY_ARRAY_AS_OBJECT => true,
660605
AbstractObjectNormalizer::PRESERVE_EMPTY_OBJECTS => true,

0 commit comments

Comments
 (0)