3

在 Apigility 中,可以通过 Apigility UIHydrator为每个设置一个Entity

在此处输入图像描述

或直接在 中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',
            ),
            ...
        ),
        ...
    ),
    ...
);

另请参阅文档

目前我正在ClassMethods为我的所有实体使用水合器。

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

编辑:它适用于单个实体,但不适用于集合。我已经用调试器检查了这个并看到:当我检索一个集合时,我的自定义水合器不会被调用。我不知道实际使用的是哪个 hydrator —— 我设置了断点,甚至在所有 hydrator的and方法中都写了die()s ( , , , , 以及我的 custom ),但是应用程序根本没有注意到这一点并且仍在工作。似乎是这样,根本没有补水……extract()hydrate()ArraySerializableClassMethodsObjectPropertyReflectionProjectHydrator

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

4

2 回答 2

0

当您为您的服务定义实体类时,您还可以选择为您的服务配置集合实体。您需要将 hydrator 关联到元数据中的 Collection 实体。

return [
    'zf-rest' => [
        'Portfolio\\V2\\Rest\\Project\\Controller' => [
            // other config
            'entity_class' => 'Portfolio\\V2\\Rest\\Project\\ProjectEntity',
            'collection_class' => 'Portfolio\\V2\\Rest\\Project\\ProjectCollection',
        ]
    ],
    'zf-hal' => [
        'metadata_map' => [
            'Portfolio\\V2\\Rest\\Project\\ProjectEntity' => [
                // other config
                'hydrator' => 'MyNamespace\\Hydrator\\ProjectHydrator'
            ],
            'Portfolio\\V2\\Rest\\Project\\ProjectCollection' => [
                // other config
                'hydrator' => 'MyNamespace\\Hydrator\\ProjectCollectionHydrator'
            ]
        ]
    ]
]
于 2015-04-28T20:46:30.903 回答
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

需要为此调用问题。

编辑[07.10.16]:

我错了。

我的解决方案适用于 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

于 2016-10-07T11:40:39.233 回答