0

我是 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]);

当我使用 hydrator 进行测试时,它的工作原理如下:

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);

链接生成正确,但元数据(版本信息)为空。任何帮助都感激不尽。

注意:我的真实代码很复杂,在这里我尝试生成一个更简单的问题版本。

4

1 回答 1

0

我认为在生成响应时会调用 hydrate 方法。因此,您的测试似乎并未测试您要测试的内容。

补水时,补水器与 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]);
于 2019-04-15T11:50:50.707 回答