/** * @param ServiceLocatorInterface $serviceLocator * @return Plugin\JsonLD */ public function createService(ServiceLocatorInterface $serviceLocator) { $services = $serviceLocator->getServiceLocator(); $jsonLDConfig = $services->get('ZF\\JsonLD\\JsonLDConfig'); /* @var $rendererOptions \ZF\JsonLD\RendererOptions */ $rendererOptions = $services->get('ZF\\JsonLD\\RendererOptions'); $metadataMap = $services->get('ZF\\JsonLD\\MetadataMap'); $hydrators = $metadataMap->getHydratorManager(); $serverUrlHelper = $serviceLocator->get('ServerUrl'); if (isset($jsonLDConfig['options']['use_proxy'])) { $serverUrlHelper->setUseProxy($jsonLDConfig['options']['use_proxy']); } $urlHelper = $serviceLocator->get('Url'); $helper = new Plugin\JsonLD($hydrators); $helper->setMetadataMap($metadataMap)->setServerUrlHelper($serverUrlHelper)->setUrlHelper($urlHelper); $propertyExtractor = new PropertyExtractor($serverUrlHelper, $urlHelper); $propertyCollectionExtractor = new PropertyCollectionExtractor($propertyExtractor); $helper->setPropertyCollectionExtractor($propertyCollectionExtractor); $defaultHydrator = $rendererOptions->getDefaultHydrator(); if ($defaultHydrator) { if (!$hydrators->has($defaultHydrator)) { throw new Exception\DomainException(sprintf('Cannot locate default hydrator by name "%s" via the HydratorManager', $defaultHydrator)); } $hydrator = $hydrators->get($defaultHydrator); $helper->setDefaultHydrator($hydrator); } $helper->setRenderEmbeddedEntities($rendererOptions->getRenderMemberEntities()); $helper->setRenderCollections($rendererOptions->getRenderMemberCollections()); $hydratorMap = $rendererOptions->getHydrators(); foreach ($hydratorMap as $class => $hydratorServiceName) { $helper->addHydrator($class, $hydratorServiceName); } return $helper; }
public function testDoesNotRenderEmbeddedEntitiesInsideCollectionsBasedOnMetadataMapAndRenderEmbeddedEntitiesAsFalse() { $entity = new TestAsset\Entity('spock', 'Spock'); $entity->first_child = new TestAsset\EmbeddedEntity('bar', 'Bar'); $entity->second_child = new TestAsset\EmbeddedEntityWithCustomIdentifier('baz', 'Baz'); $metadata = new MetadataMap(['ZFTest\\JsonLD\\Plugin\\TestAsset\\EmbeddedEntity' => ['hydrator' => 'Zend\\Hydrator\\ObjectProperty', 'route' => 'hostname/embedded'], 'ZFTest\\JsonLD\\Plugin\\TestAsset\\EmbeddedEntityWithCustomIdentifier' => ['hydrator' => 'Zend\\Hydrator\\ObjectProperty', 'route' => 'hostname/embedded_custom', 'route_identifier_name' => 'custom_id', 'entity_identifier_name' => 'custom_id'], 'ZFTest\\JsonLD\\Plugin\\TestAsset\\Collection' => ['is_collection' => true, 'route' => 'hostname/contacts', 'entity_route' => 'hostname/embedded'], 'ZFTest\\JsonLD\\Plugin\\TestAsset\\Entity' => ['hydrator' => 'Zend\\Hydrator\\ObjectProperty', 'route_name' => 'hostname/resource']]); $this->plugin->setMetadataMap($metadata); $this->plugin->setRenderEmbeddedEntities(false); $collection = new Collection([$entity], 'hostname/resource'); $self = new Property('id'); $self->setRoute('hostname/resource'); $collection->getProperties()->add($self); $collection->setCollectionName('resources'); $rendered = $this->plugin->renderCollection($collection); $this->assertRelationalPropertyContains('/resource', 'id', $rendered); $this->assertArrayHasKey('resources', $rendered); $embed = $rendered['resources']; $this->assertInternalType('array', $embed); $this->assertEquals(1, count($embed)); $resource = array_shift($embed); $this->assertInternalType('array', $resource); $this->assertArrayHasKey('first_child', $resource); $this->assertArrayHasKey('second_child', $resource); $this->assertInternalType('array', $resource['first_child']); $this->assertArrayHasKey('id', $resource['first_child']); $this->assertInternalType('array', $resource['second_child']); $this->assertArrayHasKey('id', $resource['second_child']); }