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;
 }
예제 #4
0
 /**
  * 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);
 }
예제 #5
0
 /**
  * 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);
     }
 }
예제 #6
0
파일: HalTest.php 프로젝트: zfcampus/zf-hal
 /**
  * @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);
 }
예제 #7
0
 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());
 }
예제 #8
0
파일: HalTest.php 프로젝트: jbarentsen/drb
    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']);
    }