diff --git a/src/HalResource.php b/src/HalResource.php index e9e1be1..56a80a0 100644 --- a/src/HalResource.php +++ b/src/HalResource.php @@ -119,6 +119,17 @@ public function getElement(string $name) return $this->data[$name]; } + /** + * Check if embedded resources contain a specific key + * + * @param string $name + * @return bool + */ + public function hasEmbedded(string $name): bool + { + return array_key_exists($name, $this->embedded); + } + /** * Retrieve all elements of the resource. * diff --git a/test/ResourceGenerator/ResourceWithNestedInstancesTest.php b/test/ResourceGenerator/ResourceWithNestedInstancesTest.php index 0b6f756..a31366c 100644 --- a/test/ResourceGenerator/ResourceWithNestedInstancesTest.php +++ b/test/ResourceGenerator/ResourceWithNestedInstancesTest.php @@ -66,6 +66,41 @@ public function testNestedObjectInMetadataMapIsEmbeddedAsResource() $this->assertEquals($child->message, $childResource->getElement('message')); } + public function testNullValuedNestedObjectIsEmbedded() + { + $foo = new TestAsset\FooBar; + $foo->id = 1234; + $foo->foo = 'FOO'; + $foo->bar = null; + + $request = $this->prophesize(ServerRequestInterface::class); + + $metadataMap = $this->createMetadataMap(); + $hydrators = $this->createHydrators(); + $linkGenerator = $this->createLinkGenerator($request); + + $generator = new ResourceGenerator( + $metadataMap->reveal(), + $hydrators->reveal(), + $linkGenerator->reveal() + ); + + $generator->addStrategy( + RouteBasedResourceMetadata::class, + ResourceGenerator\RouteBasedResourceStrategy::class + ); + + $generator->addStrategy( + RouteBasedCollectionMetadata::class, + ResourceGenerator\RouteBasedCollectionStrategy::class + ); + + $resource = $generator->fromObject($foo, $request->reveal()); + $this->assertInstanceOf(HalResource::class, $resource); + + $this->assertTrue($resource->hasEmbedded('bar')); + } + public function createMetadataMap() { $metadataMap = $this->prophesize(MetadataMap::class);