在 Apigility 驱动的 ZF2 应用程序中,我想使用自定义的Hydrator
.
Module
班级
class Module implements ApigilityProviderInterface {
...
public function getServiceConfig() {
return array(
'factories' => array(
...
'MyNamespace\\Hydrator\\ProjectHydrator' => function(ServiceManager $serviceManager) {
$projectHydrator = new ProjectHydrator();
$projectHydrator->setImageService($serviceManager->get('Portfolio\V2\Rest\ImageService'));
return $projectHydrator;
}
),
...
);
}
}
module.config.php
...
'zf-hal' => array(
'metadata_map' => array(
...
'Portfolio\\V2\\Rest\\Project\\ProjectEntity' => array(
'entity_identifier_name' => 'id',
'route_name' => 'portfolio.rest.project',
'route_identifier_name' => 'id',
// 'hydrator' => 'Zend\\Stdlib\\Hydrator\\ClassMethods',
'hydrator' => 'MyNamespace\\Hydrator\\ProjectHydrator',
),
...
),
),
...
当一个集合被检索到时,它会被忽略,但这是另一个问题(s. here)。当需要单个实体时,hydratin 机制启动,但它不使用我的工厂来创建实例。
经过一些调试后,我来到了ZF\Hal\Metadata\Metadata#setHydrator(...)
代码中的这个地方:
if (is_string($hydrator)) {
if (null !== $this->hydrators
&& $this->hydrators->has($hydrator)
) {
$hydrator = $this->hydrators->get($hydrator);
} elseif (class_exists($hydrator)) {
$hydrator = new $hydrator(); // <-- here
}
}
Hydrator
直接创建自定义。(在我的情况下,它会导致一个致命错误,因为它试图在 上执行一个ProjectHydrator#imageService
未设置的方法)。我看了一下Metadata#hydrators
(of type Zend\Stdlib\Hydrator\HydratorPluginManager
),发现只有四个 default invocables
,这就是为什么null !== $this->hydrators && $this->hydrators->has($hydrator)
isfalse
并尝试了直接实例化。
所以,我想,我必须注册我的定制保湿剂。我在哪里/如何做到这一点?
编辑:
我将工厂代码从移动Module#getServiceConfig()
到Module#getHydratorConfig()
:
public function getHydratorConfig() {
return array(
'factories' => array(
// V2
'MyNamespace\\Hydrator\\ProjectHydrator' => function(ServiceManager $serviceManager) {
$projectHydrator = new ProjectHydrator();
$projectHydrator->setImageService($serviceManager->get('Portfolio\V2\Rest\ImageService'));
return $projectHydrator;
}
),
);
}
module.config.php
(需要一个Factory
类)中的配置数组相同:
module.config.php
return array(
...
'hydrators' => array(
'factories' => array(
'MyNamespace\\Hydrator\\ProjectHydrator' => 'MyNamespace\\Hydrator\\ProjectHydratorFactory',
),
),
);
但它以错误结束:
Zend\ServiceManager\Exception\ServiceNotFoundException
文件:/var/www/my-project/vendor/zendframework/zendframework/library/Zend/ServiceManager/ServiceManager.php:550 消息:Zend\Stdlib\Hydrator\HydratorPluginManager::get 无法获取或创建投资组合实例\V2\Rest\ImageService