Настройки гидратора игнорируются в 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.

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

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

3

Решение

Когда вы определили класс 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'
]
]
]
]
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',
),

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

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

0

По вопросам рекламы [email protected]