From c6f44fbee9b4fa5e4e21ada28838a0c8e68e1ee6 Mon Sep 17 00:00:00 2001 From: Matthew Weier O'Phinney Date: Mon, 1 Mar 2021 16:29:39 -0600 Subject: [PATCH 1/2] qa: adds test demonstrating #24 New unit test, `EntityExtractorTest::testExtractOfArrayObjectEntityWillExtractCorrectly`, demonstrates the problem outlined in #24 when run against PHP 7.4 and up (test passes on 7.3 and below). Signed-off-by: Matthew Weier O'Phinney --- test/Extractor/EntityExtractorTest.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/test/Extractor/EntityExtractorTest.php b/test/Extractor/EntityExtractorTest.php index 7792b6d..e088208 100644 --- a/test/Extractor/EntityExtractorTest.php +++ b/test/Extractor/EntityExtractorTest.php @@ -8,6 +8,7 @@ namespace LaminasTest\ApiTools\Hal\Extractor; +use ArrayObject; use Laminas\ApiTools\Hal\EntityHydratorManager; use Laminas\ApiTools\Hal\Extractor\EntityExtractor; use Laminas\Hydrator\ObjectProperty; @@ -70,4 +71,16 @@ public function testExtractTwiceGivenSameEntityShouldProcessExtractionOnceAndRet $this->assertSame($data1, $data2); } + + public function testExtractOfArrayObjectEntityWillExtractCorrectly() + { + $data = ['id' => 'foo', 'message' => 'FOO']; + $entity = new ArrayObject($data); + $entityHydratorManager = $this->prophesize(EntityHydratorManager::class); + $entityHydratorManager->getHydratorForEntity($entity)->willReturn(null)->shouldBeCalledTimes(1); + + $extractor = new EntityExtractor($entityHydratorManager->reveal()); + + $this->assertSame($data, $extractor->extract($entity)); + } } From ac8b67f1bf88a54eb914d053c37b7c39819fcba9 Mon Sep 17 00:00:00 2001 From: Matthew Weier O'Phinney Date: Mon, 1 Mar 2021 16:31:41 -0600 Subject: [PATCH 2/2] fix: ensure `ArrayObject` entities can be extracted in all PHP versions Adds checks for `ArrayObject` entities in each implementation of the EntityExtractorHydrator, calling `getArrayCopy()` on the instance when found, instead of `get_object_properties()` Signed-off-by: Matthew Weier O'Phinney --- src/Extractor/EntityExtractorHydratorV2.php | 5 +++++ src/Extractor/EntityExtractorHydratorV3.php | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/src/Extractor/EntityExtractorHydratorV2.php b/src/Extractor/EntityExtractorHydratorV2.php index d6bf7b8..1bbb2f3 100644 --- a/src/Extractor/EntityExtractorHydratorV2.php +++ b/src/Extractor/EntityExtractorHydratorV2.php @@ -8,6 +8,7 @@ namespace Laminas\ApiTools\Hal\Extractor; +use ArrayObject; use JsonSerializable; use Laminas\ApiTools\Hal\EntityHydratorManager; use Laminas\Hydrator\ExtractionInterface; @@ -68,6 +69,10 @@ private function extractEntity($entity) return $entity->jsonSerialize(); } + if ($entity instanceof ArrayObject) { + return $entity->getArrayCopy(); + } + return get_object_vars($entity); } } diff --git a/src/Extractor/EntityExtractorHydratorV3.php b/src/Extractor/EntityExtractorHydratorV3.php index 59ba6dc..952f9fd 100644 --- a/src/Extractor/EntityExtractorHydratorV3.php +++ b/src/Extractor/EntityExtractorHydratorV3.php @@ -8,6 +8,7 @@ namespace Laminas\ApiTools\Hal\Extractor; +use ArrayObject; use JsonSerializable; use Laminas\ApiTools\Hal\EntityHydratorManager; use Laminas\Hydrator\ExtractionInterface; @@ -68,6 +69,10 @@ private function extractEntity(object $entity) : array return $entity->jsonSerialize(); } + if ($entity instanceof ArrayObject) { + return $entity->getArrayCopy(); + } + return get_object_vars($entity); } }