Настройки гидратора игнорируются в Apigility

В Apigility можно установить Hydrator для каждого Entity - либо через интерфейс Apigility

или прямо в 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.

РЕДАКТИРОВАТЬ: Это работает для сущностей Sigle, но не для коллекций. Я проверил это с помощью отладчика и вижу: когда я получаю коллекцию, мой пользовательский гидратор не вызывается. Я не могу выяснить, какой гидратор на самом деле используется - я установил контрольные точки и даже написал die() в extract() а также hydrate() методы всех гидраторов (ArraySerializable, ClassMethods, ObjectProperty, Reflection а также по моему обычаю ProjectHydrator), но приложение вообще этого не замечало и все еще работает. Похоже, что гидратация не производится вообще...

Что здесь не так и как правильно настроить параметры гидратации?

2 ответа

Когда вы определили класс Entity для вашей службы, у вас также есть возможность настроить сущность 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'
            ]
        ]
    ]
]

Старый но нашел это: Для collectionRender гидратор не называется https://github.com/zfcampus/zf-hal/blob/master/src/Plugin/Hal.php

Для entityRender это: https://github.com/zfcampus/zf-hal/blob/master/src/Plugin/Hal.php

Нужно назвать вопрос для этого.

Редактировать [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',
        ),

Первый для сущности. Второй - элементы возвращенной коллекции.

Затем в 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

Другие вопросы по тегам