public function testLinkCollectionMayBeInjected() { $resource = new stdClass(); $hal = new HalResource($resource, 'id', 'route', array('foo' => 'bar')); $links = new LinkCollection(); $hal->setLinks($links); $this->assertSame($links, $hal->getLinks()); }
public function setUpChildResource($id, $name) { $this->child = (object) array('id' => $id, 'name' => $name); $resource = new HalResource($this->child, $id); $link = new Link('self'); $link->setRoute('parent/child'); $link->setRouteParams(array('child' => $id)); $resource->getLinks()->add($link); return $resource; }
public function halObjects() { $resource = new HalResource(array('foo' => 'bar'), 'identifier', 'route'); $link = new Link('self'); $link->setRoute('resource/route')->setRouteParams(array('id' => 'identifier')); $resource->getLinks()->add($link); $collection = new HalCollection(array($resource)); $collection->setCollectionRoute('collection/route'); $collection->setResourceRoute('resource/route'); return array('resource' => array($resource), 'collection' => array($collection)); }
/** * @group 79 */ public function testRenderResourceTriggersEvent() { $resource = new HalResource((object) array('id' => 'user', 'name' => 'matthew'), 'user'); $self = new Link('self'); $self->setRoute('hostname/users', array('id' => 'user')); $resource->getLinks()->add($self); $this->plugin->getEventManager()->attach('renderResource', function ($e) { $resource = $e->getParam('resource'); $resource->getLinks()->get('self')->setRouteParams(array('id' => 'matthew')); }); $rendered = $this->plugin->renderResource($resource); $this->assertContains('/users/matthew', $rendered['_links']['self']['href']); }
/** * Create a resource and/or collection based on a metadata map * * @param object $object * @param Metadata $metadata * @return HalResource|HalCollection */ public function createResourceFromMetadata($object, Metadata $metadata) { if ($metadata->isCollection()) { return $this->createCollectionFromMetadata($object, $metadata); } if ($metadata->hasHydrator()) { $hydrator = $metadata->getHydrator(); } else { $hydrator = $this->getHydratorForResource($object); } if (!$hydrator instanceof HydratorInterface) { throw new Exception\RuntimeException(sprintf('Unable to extract %s; no hydrator registered', get_class($object))); } $data = $hydrator->extract($object); $identiferName = $metadata->getIdentifierName(); if (!isset($data[$identiferName])) { throw new Exception\RuntimeException(sprintf('Unable to determine identifier for object of type "%s"; no fields matching "%s"', get_class($object), $identiferName)); } $id = $data[$identiferName]; $resource = new HalResource($data, $id); $links = $resource->getLinks(); $this->marshalMetadataLinks($metadata, $links); if (!$links->has('self')) { $link = $this->marshalSelfLinkFromMetadata($metadata, $object, $id, $identiferName); $links->add($link); } return $resource; }
public function testRendersEmbeddedResourcesOfIndividualPaginatedCollectionResources() { $this->setUpHelpers(); $this->router->addRoute('user', new Segment('/user[/:id]')); $child = new HalResource(array('id' => 'matthew', 'name' => 'matthew', 'github' => 'weierophinney'), 'matthew', 'user'); $link = new Link('self'); $link->setRoute('user')->setRouteParams(array('id' => 'matthew')); $child->getLinks()->add($link); $prototype = array('foo' => 'bar', 'user' => $child); $items = array(); foreach (range(1, 3) as $id) { $item = $prototype; $item['id'] = $id; $items[] = $item; } $adapter = new ArrayAdapter($items); $paginator = new Paginator($adapter); $collection = new HalCollection($paginator); $collection->setPageSize(5); $collection->setPage(1); $collection->setCollectionRoute('resource'); $collection->setResourceRoute('resource'); $links = $collection->getLinks(); $self = new Link('self'); $self->setRoute('resource'); $links->add($self); $model = new RestfulJsonModel(array('payload' => $collection)); $test = $this->renderer->render($model); $test = json_decode($test); $this->assertInstanceof('stdClass', $test, var_export($test, 1)); $collection = $test->_embedded->items; foreach ($collection as $item) { $this->assertObjectHasAttribute('_embedded', $item, var_export($item, 1)); $embedded = $item->_embedded; $this->assertObjectHasAttribute('user', $embedded); $user = $embedded->user; $this->assertRelationalLinkContains('/user/matthew', 'self', $user); $user = (array) $user; foreach ($child->resource as $key => $value) { $this->assertArrayHasKey($key, $user); $this->assertEquals($value, $user[$key]); } } }