/** * Determine the response content-type to return based on the view model. * * @param ApiProblemModel|HalJsonModel|\Zend\View\Model\ModelInterface $model * @return string The content-type to use. */ private function getContentTypeFromModel($model) { if ($model instanceof ApiProblemModel) { return 'application/problem+json'; } if ($model instanceof HalJsonModel && ($model->isCollection() || $model->isEntity())) { return 'application/hal+json'; } return $this->contentType; }
public function testChildResourceObjectIdentifierMappingInCollectionsViaControllerReturn() { $this->setUpAlternateRouter(); $resource = new Resource(); $resource->getEventManager()->attach('fetchAll', function ($e) { return array((object) array('id' => 'luke', 'name' => 'Luke Skywalker'), (object) array('id' => 'leia', 'name' => 'Leia Organa')); }); $controller = new RestController(); $controller->setPluginManager($this->plugins); $controller->setResource($resource); $controller->setRoute('parent/child'); $controller->setIdentifierName('child_id'); $controller->setCollectionName('children'); $r = new ReflectionObject($controller); $m = $r->getMethod('getIdentifier'); $m->setAccessible(true); $uri = 'http://localhost.localdomain/api/parent/anakin/child'; $request = new Request(); $request->setUri($uri); $matches = $this->router->match($request); $this->assertInstanceOf('Zend\\Mvc\\Router\\RouteMatch', $matches); $this->assertEquals('anakin', $matches->getParam('id')); $this->assertNull($matches->getParam('child_id')); $this->assertEquals('parent/child', $matches->getMatchedRouteName()); // Emulate url helper factory and inject route matches $this->helpers->get('url')->setRouteMatch($matches); $result = $controller->getList(); $this->assertInstanceOf('ZF\\Hal\\Collection', $result); // Now, what happens if we render this? $model = new HalJsonModel(); $model->setPayload($result); $json = $this->renderer->render($model); $test = json_decode($json); $this->assertObjectHasAttribute('_links', $test); $this->assertObjectHasAttribute('self', $test->_links); $this->assertObjectHasAttribute('href', $test->_links->self); $this->assertEquals('http://localhost.localdomain/api/parent/anakin/child', $test->_links->self->href); $this->assertObjectHasAttribute('_embedded', $test); $this->assertObjectHasAttribute('children', $test->_embedded); $this->assertInternalType('array', $test->_embedded->children); foreach ($test->_embedded->children as $child) { $this->assertObjectHasAttribute('_links', $child); $this->assertObjectHasAttribute('self', $child->_links); $this->assertObjectHasAttribute('href', $child->_links->self); $this->assertRegexp('#^http://localhost.localdomain/api/parent/anakin/child/[^/]+$#', $child->_links->self->href); } }
protected function normalizeEntityInputFilterName(Model\InputFilterEntity $entity, $links, HalJsonModel $model) { $entity['input_filter_name'] = str_replace('\\', '-', $entity['input_filter_name']); $halEntity = new Entity($entity, $entity['input_filter_name']); if ($links->has('self')) { $links->remove('self'); } $halEntity->setLinks($links); $model->setPayload($halEntity); }
public function testChildEntityIdentifierMappingInsideCollection() { $this->setUpAlternateRouter(); $uri = 'http://localhost.localdomain/api/parent/anakin/child'; $request = new Request(); $request->setUri($uri); $matches = $this->router->match($request); $this->assertInstanceOf('Zend\\Mvc\\Router\\RouteMatch', $matches); $this->assertEquals('anakin', $matches->getParam('id')); $this->assertNull($matches->getParam('child_id')); $this->assertEquals('parent/child', $matches->getMatchedRouteName()); // Emulate url helper factory and inject route matches $this->helpers->get('url')->setRouteMatch($matches); $collection = $this->setUpChildCollection(); $model = new HalJsonModel(); $model->setPayload($collection); $json = $this->renderer->render($model); $test = json_decode($json); $this->assertObjectHasAttribute('_links', $test); $this->assertObjectHasAttribute('self', $test->_links); $this->assertObjectHasAttribute('href', $test->_links->self); $this->assertEquals('http://localhost.localdomain/api/parent/anakin/child', $test->_links->self->href); $this->assertObjectHasAttribute('_embedded', $test); $this->assertObjectHasAttribute('child', $test->_embedded); $this->assertInternalType('array', $test->_embedded->child); foreach ($test->_embedded->child as $child) { $this->assertObjectHasAttribute('_links', $child); $this->assertObjectHasAttribute('self', $child->_links); $this->assertObjectHasAttribute('href', $child->_links->self); $this->assertRegex('#^http://localhost.localdomain/api/parent/anakin/child/[^/]+$#', $child->_links->self->href); } }