Почему моя реализация Zend-HAL не работает с защищенными значениями
Я новичок в Zend Framework и пытаюсь использовать 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);
Ссылка сгенерирована правильно, но метаданные (информация о версии) появляются как пустые. Любая помощь будет высоко ценится.
NB: Мой настоящий код сложен, здесь я попытался создать более простую версию проблемы.
1 ответ
Я думаю, что при генерировании ответа вызывается гидратный метод. Таким образом, ваш тест, похоже, не проверяет, что вы хотели проверить.
При увлажнении гидратор работает с ReflectionClass. Поэтому вам нужно добавить индексы из $data в качестве свойств в классе Version.
например
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]);