Apigility中忽略了水分器设置

时间:2015-03-12 09:34:31

标签: php zend-framework2 settings apigility

在Apigility中,可以为每个Hydrator设置一个Entity - 通过Apigility UI

enter image description here

或直接在module.config.php中,例如:

return array(
    ...
    '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\\ObjectProperty',
                // 'hydrator' => 'MyNamespace\\Hydrator\\ProjectHydrator',
            ),
            ...
        ),
        ...
    ),
    ...
);

另请参阅documentation

目前我正在为我的所有实体使用ClassMethods保湿剂。

现在我尝试将设置更改为自定义保水器。我也尝试了另一种Zend保湿剂。但无论我做什么,只有我在`module.config.php中定义的水合物被忽略。

编辑:它适用于单元实体,但不适用于集合。我用调试器检查了这个,看看:当我收集一个集合时,我的自定义水合器不会被调用。我无法找到,实际上正在使用哪个保温器 - 我设置了断点,甚至在所有保水器的die()extract()方法中写了hydrate() ArraySerializable,{ {1}},ClassMethodsObjectProperty以及我的自定义Reflection),但应用程序根本没有注意到它仍然有效。似乎是这样,根本没有水合作用......

这里有什么问题以及如何让水合设置正常工作?

2 个答案:

答案 0 :(得分:0)

为服务定义Entity类时,还可以选择为服务配置Collection实体。您需要将水合器与元数据中的Collection实体相关联。

- (BOOL)intersectsNode:(SKNode *)node

答案 1 :(得分:0)

老但发现了这个: 对于collectionRender,不会调用保湿剂 https://github.com/zfcampus/zf-hal/blob/master/src/Plugin/Hal.php#L570

对于entityRender是: https://github.com/zfcampus/zf-hal/blob/master/src/Plugin/Hal.php#L695

需要为此调用问题。

编辑[16年7月10日]:

我错了。

我的解决方案适用于Apigility 1.3。没有测试早期版本。

您可以使用Zend\\Hydrator\\DelegatingHydrator

        'metadata_map' => array(
        'Test\\DomainModel\\UseCase\\Query\\ShowTask\\Response\\Task' => array(
            'entity_identifier_name' => 'uuid',
            'route_name' => 'descriptive-module.rest.task',
            'route_identifier_name' => 'task_id',
            'hydrator' => 'Zend\\Hydrator\\DelegatingHydrator',
        ),
        'Test\\DomainModel\\UseCase\\Query\\ListTask\\Response\\Task' => array(
            'entity_identifier_name' => 'uuid',
            'route_name' => 'descriptive-module.rest.task',
            'route_identifier_name' => 'task_id',
            'hydrator' => 'Zend\\Hydrator\\DelegatingHydrator',
        ),

第一个,对于实体。 第二个,返回Collection的元素。

然后在module.config.php

   'hydrators' => array(
    'invokables' => array(
        \Test\DomainModel\UseCase\Query\ShowTask\Response\Task::class =>
            \TestApi\V1\Rest\Task\Hydrator\ShowTaskHydrator::class,
        \Test\DomainModel\UseCase\Query\ListTask\Response\Task::class =>
            \TestApi\V1\Rest\Task\Hydrator\ListTaskHydrator::class,
    ),
    'factories' => array(),
),

TaskShowHydrator / ListTaskHydrator需要实施Zend\Hydrator\HydratorInterface