Skip to content

Commit

Permalink
Merge pull request #29 from weierophinney/hotfix/array-object-extraction
Browse files Browse the repository at this point in the history
Fix ArrayObject extraction on PHP 7.4+
  • Loading branch information
weierophinney authored Mar 1, 2021
2 parents 2d57434 + ac8b67f commit e7c38b9
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 0 deletions.
5 changes: 5 additions & 0 deletions src/Extractor/EntityExtractorHydratorV2.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

namespace Laminas\ApiTools\Hal\Extractor;

use ArrayObject;
use JsonSerializable;
use Laminas\ApiTools\Hal\EntityHydratorManager;
use Laminas\Hydrator\ExtractionInterface;
Expand Down Expand Up @@ -68,6 +69,10 @@ private function extractEntity($entity)
return $entity->jsonSerialize();
}

if ($entity instanceof ArrayObject) {
return $entity->getArrayCopy();
}

return get_object_vars($entity);
}
}
5 changes: 5 additions & 0 deletions src/Extractor/EntityExtractorHydratorV3.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

namespace Laminas\ApiTools\Hal\Extractor;

use ArrayObject;
use JsonSerializable;
use Laminas\ApiTools\Hal\EntityHydratorManager;
use Laminas\Hydrator\ExtractionInterface;
Expand Down Expand Up @@ -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);
}
}
13 changes: 13 additions & 0 deletions test/Extractor/EntityExtractorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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));
}
}

0 comments on commit e7c38b9

Please sign in to comment.