diff --git a/composer.json b/composer.json index bb016a21..36f6ab80 100644 --- a/composer.json +++ b/composer.json @@ -31,6 +31,7 @@ "zendframework/zend-log": "^2.5.0", "zendframework/zend-serializer": "^2.5.0", "zendframework/zend-test": "^2.5.0", + "zendframework/zend-hydrator": "~1", "zfcampus/zf-apigility-admin": "^1.1", "zendframework/zend-i18n": "^2.5.0" }, diff --git a/src/Server/Resource/DoctrineResourceFactory.php b/src/Server/Resource/DoctrineResourceFactory.php index feaba713..8373fce1 100644 --- a/src/Server/Resource/DoctrineResourceFactory.php +++ b/src/Server/Resource/DoctrineResourceFactory.php @@ -108,6 +108,7 @@ public function createServiceWithName(ServiceLocatorInterface $serviceLocator, $ { $config = $serviceLocator->get('Config'); $doctrineConnectedConfig = $config['zf-apigility']['doctrine-connected'][$requestedName]; + $doctrineHydratorConfig = $config['doctrine-hydrator']; $restConfig = null; foreach ($config['zf-rest'] as $restControllerConfig) { @@ -129,7 +130,12 @@ public function createServiceWithName(ServiceLocatorInterface $serviceLocator, $ $className = $this->normalizeClassname($className); $objectManager = $this->loadObjectManager($serviceLocator, $doctrineConnectedConfig); - $hydrator = $this->loadHydrator($serviceLocator, $doctrineConnectedConfig, $objectManager); + $hydrator = $this->loadHydrator( + $serviceLocator, + $doctrineConnectedConfig, + $doctrineHydratorConfig, + $objectManager + ); $queryProviders = $this->loadQueryProviders($serviceLocator, $doctrineConnectedConfig, $objectManager); $queryCreateFilter = $this->loadQueryCreateFilter($serviceLocator, $doctrineConnectedConfig, $objectManager); $configuredListeners = $this->loadConfiguredListeners($serviceLocator, $doctrineConnectedConfig); @@ -187,10 +193,15 @@ protected function loadObjectManager(ServiceLocatorInterface $serviceLocator, $c * * @return HydratorInterface */ - protected function loadHydrator(ServiceLocatorInterface $serviceLocator, $config) - { + protected function loadHydrator( + ServiceLocatorInterface $serviceLocator, + array $doctrineConnectedConfig, + array $doctrineHydratorConfig, + $objectManager + ) { + // @codeCoverageIgnoreStart - if (!isset($config['hydrator'])) { + if (!isset($doctrineConnectedConfig['hydrator'])) { return null; } @@ -199,11 +210,22 @@ protected function loadHydrator(ServiceLocatorInterface $serviceLocator, $config } $hydratorManager = $serviceLocator->get('HydratorManager'); - if (!$hydratorManager->has($config['hydrator'])) { + if (!$hydratorManager->has($doctrineConnectedConfig['hydrator'])) { return null; } + + // Set the hydrator for the entity for this resource to the hydrator + // configured for the resource. This removes per-entity hydrator configuration + // allowing multiple hydrators per resource. + if (isset($doctrineConnectedConfig['hydrator'])) { + $entityClass = $doctrineHydratorConfig[$doctrineConnectedConfig['hydrator']]['entity_class']; + $viewHelpers = $serviceLocator->get('ViewHelperManager'); + $hal = $viewHelpers->get('Hal'); + $hal->getEntityHydratorManager()->addHydrator($entityClass, $doctrineConnectedConfig['hydrator']); + } + // @codeCoverageIgnoreEnd - return $hydratorManager->get($config['hydrator']); + return $hydratorManager->get($doctrineConnectedConfig['hydrator']); } /**