Почему моя реализация Zend-HAL не работает с защищенными значениями

Я новичок в среде Zend и пытаюсь использовать HAL для генерации ответов API. Ниже приведена более простая ситуация моих проблем.

Класс:

class Version
{
    protected $data;

    public function __construct($ar){
        $data = $ar;
    }

    public function getArrayCopy(){
        return $data;
    }
}
$obj = new version(['major'=>1,'minor'=>2,'fix'=>3]);

Когда я тестирую гидратор, он работает хорошо в соответствии со следующим:

use Zend\Hydrator\ArraySerializableHydrator;

$hydrator           = new ArraySerializableHydrator();
$data =  $hydrator->extract($obj);

print_r($data); // outputs ['major'=>1,'minor'=>2,'fix'=>3]

Моя конфигурация HAL следующая:

MetadataMap::class => [
    [
        '__class__' => RouteBasedResourceMetadata::class,
        'resource_class' => Version::class,
        'route' => 'version',
        'extractor' => ArraySerializableHydrator::class,
    ],
]

Я использую следующую строку в своем обработчике запросов Zend Expressive (версия 3):

$resource = $this->resourceGenerator->fromObject($obj, $request);
$res = $this->responseFactory->createResponse($request, $resource);

Ссылка генерируется правильно, но метаданные (информация о версии) приходят как пустые. Любая помощь будет высоко ценится.

N.B.: Мой реальный код сложный, здесь я попытался сгенерировать более простую версию задачи.


person Md Monjur Ul Hasan    schedule 26.03.2019    source источник
comment
В вашем конструкторе Version вы не назначаете массив своему свойству данных, $data = $ar; должно быть $this->data = $ar;, а ваш метод getArrayCopy должен return $this->data;   -  person Crisp    schedule 26.03.2019


Ответы (1)


Я думаю, что при генерации ответа вызывается метод гидрата. Таким образом, ваш тест, похоже, не проверяет то, что вы хотели проверить.

При увлажнении гидратор работает с ReflectionClass. Поэтому вам нужно добавить индексы из $data в качестве свойств в классе Version.

e.g.

class Version
{
    protected $major;
    protected $minor;
    protected $fix;

    public function __construct($data){
        foreach($data as $key => $value) {
           $this->{$key} = $value;
        }
    }

    public function getArrayCopy(){
        return [
        'major' => $this->major,
        'minor' => $this->minor,
        'fix' => $this->fix
         ];
    }
}
$obj = new version(['major'=>1,'minor'=>2,'fix'=>3]);
person Razvan Ionascu    schedule 15.04.2019