public function testLinkCollectionWithTwoLinksForSameRelationShouldReturnArrayWithOneKeyAggregatingLinks() { $linkCollection = new LinkCollection(); $linkCollection->add(Link::factory(['rel' => 'foo', 'url' => 'http://example.com/foo'])); $linkCollection->add(Link::factory(['rel' => 'foo', 'url' => 'http://example.com/bar'])); $linkCollection->add(Link::factory(['rel' => 'baz', 'url' => 'http://example.com/baz'])); $result = $this->linkCollectionExtractor->extract($linkCollection); $this->assertInternalType('array', $result); $this->assertCount(2, $result); $this->assertInternalType('array', $result['foo']); $this->assertCount(2, $result['foo']); }
/** * Return a HAL entity with just a self link */ public function extract($value) { if (is_null($value)) { return $value; } $entityValues = $this->getHydratorForEntity($value)->extract($value); $entityMetadata = $this->getMetadataMap()[ClassUtils::getRealClass(get_class($value))]; $link = new Link('self'); $link->setRoute($entityMetadata['route_name']); $link->setRouteParams(array($entityMetadata['route_identifier_name'] => $entityValues[$entityMetadata['entity_identifier_name']])); $linkCollection = new LinkCollection(); $linkCollection->add($link); $halEntity = new HalEntity(new stdClass()); $halEntity->setLinks($linkCollection); return $halEntity; }
public function extract($value) { if (!method_exists($value, 'getTypeClass')) { return; } $config = $this->getMetadataMap()[$value->getTypeClass()->name]; $filter = new FilterChain(); $filter->attachByName('WordCamelCaseToUnderscore')->attachByName('StringToLower'); // Better way to create mapping name? // FIXME: use zf-hal collection_name $link = new Link('self'); $link->setRoute($config['route_name']); $link->setRouteParams(array('id' => null)); $filterValue = array('field' => $value->getMapping()['mappedBy'] ?: $value->getMapping()['inversedBy'], 'type' => isset($value->getMapping()['joinTable']) ? 'ismemberof' : 'eq', 'value' => $value->getOwner()->getId()); $link->setRouteOptions(array('query' => array($this->getFilterKey() => array($filterValue)))); $linkCollection = new LinkCollection(); $linkCollection->add($link); $halEntity = new HalEntity(new stdClass()); $halEntity->setLinks($linkCollection); return $halEntity; }
/** * Inject service links * * @param string $type "rpc" | "rest" | "authorization" * @param array|\Traversable $services * @param LinkCollection $links * @param null|string $module */ protected function injectLinksForServicesByType($type, $services, LinkCollection $links, $module = null) { $urlHelper = $this->urlHelper; $linkType = $type; if (in_array($type, array('rpc', 'rest'))) { $linkType .= '-service'; } $routeName = sprintf('zf-apigility/api/module/%s', $linkType); $routeParams = array(); $routeOptions = array(); if (null !== $module) { $routeParams['name'] = $module; } $url = call_user_func($urlHelper, $routeName, $routeParams, $routeOptions, false); $url .= '{?version}'; $spec = array('rel' => $type, 'url' => $url, 'props' => array('templated' => true)); $link = Link::factory($spec); $links->add($link); }
/** * Inject any links found in the metadata into the resource's link collection * * @param Metadata $metadata * @param LinkCollection $links */ public function marshalMetadataLinks(Metadata $metadata, LinkCollection $links) { foreach ($metadata->getLinks() as $linkData) { $link = Link::factory($linkData); $links->add($link); } }
/** * @group 102 */ public function testRenderingEntityTwiceMustNotDuplicateLinkCollectionProperties() { $link = new Link('resource'); $link->setRoute('resource', ['id' => 'user']); $links = new LinkCollection(); $links->add($link); $entity = new Entity((object) ['id' => 'user', 'name' => 'matthew', 'resources' => $links], 'user'); $rendered1 = $this->plugin->renderEntity($entity); $rendered2 = $this->plugin->renderEntity($entity); $this->assertEquals($rendered1, $rendered2); }
public function testAllowsSettingAdditionalEntityLinks() { $links = new LinkCollection(); $links->add(new Link('describedby')); $links->add(new Link('orders')); $hal = new Collection(array(), 'item/route'); $hal->setEntityLinks($links); $this->assertSame($links, $hal->getEntityLinks()); }
public function testResoucePropertiesCanBeLinkCollections() { $link = new Link('embeddedLink'); $link->setRoute('hostname/contacts', array('id' => 'bar')); //simple link $collection = new LinkCollection(); $collection->add($link); //array of links $linkArray = new Link('arrayLink'); $linkArray->setRoute('hostname/contacts', array('id' => 'bar')); $collection->add($linkArray); $linkArray = new Link('arrayLink'); $linkArray->setRoute('hostname/contacts', array('id' => 'baz')); $collection->add($linkArray); $properties = array( 'id' => '10', 'links' => $collection, ); $entity = new Entity((object) $properties, 'foo'); $rendered = $this->plugin->renderEntity($entity); $this->assertArrayHasKey('_links', $rendered); $this->assertArrayHasKey('embeddedLink', $rendered['_links']); $this->assertArrayNotHasKey('embeddedLink', $rendered); $this->assertArrayHasKey('href', $rendered['_links']['embeddedLink']); $this->assertEquals('http://localhost.localdomain/contacts/bar', $rendered['_links']['embeddedLink']['href']); $this->assertArrayHasKey('arrayLink', $rendered['_links']); $this->assertCount(2, $rendered['_links']['arrayLink']); }