Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 806bb8f

Browse filesBrowse files
committed
[Serializer] Deprecate support for returning empty, iterable, countable, raw object when normalizing
1 parent dabd127 commit 806bb8f
Copy full SHA for 806bb8f

File tree

3 files changed

+95
-1
lines changed
Filter options

3 files changed

+95
-1
lines changed

‎src/Symfony/Component/Serializer/CHANGELOG.md

Copy file name to clipboardExpand all lines: src/Symfony/Component/Serializer/CHANGELOG.md
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ CHANGELOG
66

77
* Add support of PHP backed enumerations
88
* Add support for serializing empty array as object
9+
* Deprecate support for returning empty, iterable, countable, raw object when normalizing
910

1011
5.3
1112
---

‎src/Symfony/Component/Serializer/Serializer.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Serializer/Serializer.php
+4Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,10 @@ public function normalize($data, string $format = null, array $context = [])
168168
if (is_countable($data) && 0 === \count($data)) {
169169
switch (true) {
170170
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+
171175
return $data;
172176
case ($context[self::EMPTY_ARRAY_AS_OBJECT] ?? false) && \is_array($data):
173177
return new \ArrayObject();

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

Copy file name to clipboardExpand all lines: src/Symfony/Component/Serializer/Tests/SerializerTest.php
+90-1Lines changed: 90 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -606,6 +606,61 @@ public function testNormalizeEmptyArrayAsObjectAndPreserveEmptyArrayObject(Seria
606606
]));
607607
}
608608

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":{}}}';
658+
$this->assertSame($expected, $serializer->serialize($data, 'json', [
659+
Serializer::EMPTY_ARRAY_AS_OBJECT => true,
660+
AbstractObjectNormalizer::PRESERVE_EMPTY_OBJECTS => true,
661+
]));
662+
}
663+
609664
public function testNormalizeScalar()
610665
{
611666
$serializer = new Serializer([], ['json' => new JsonEncoder()]);
@@ -791,7 +846,41 @@ public function __construct(array $list)
791846
}
792847
}
793848

794-
class DummyList implements \Countable, \IteratorAggregate
849+
class DummyList extends \ArrayObject
850+
{
851+
public $list;
852+
853+
public function __construct(array $list)
854+
{
855+
$this->list = $list;
856+
857+
$this->setFlags(\ArrayObject::STD_PROP_LIST);
858+
}
859+
860+
public function count(): int
861+
{
862+
return \count($this->list);
863+
}
864+
865+
public function getIterator(): \Traversable
866+
{
867+
return new \ArrayIterator($this->list);
868+
}
869+
}
870+
871+
class BazLegacy
872+
{
873+
public $list;
874+
875+
public $settings = [];
876+
877+
public function __construct(array $list)
878+
{
879+
$this->list = new DummyListLegacy($list);
880+
}
881+
}
882+
883+
class DummyListLegacy implements \Countable, \IteratorAggregate
795884
{
796885
public $list;
797886

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.