0

私は Zend フレームワークを初めて使用し、API 応答の生成に HAL を使用しようとしています。以下は、私の問題のより簡単な状況です。

クラス:

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 表現力豊かな (バージョン 3) リクエスト ハンドラーで次の行を使用します。

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

リンクは正しく生成されますが、メタ データ (バージョン情報) は空になります。どんな助けでも大歓迎です。

注意: 私の実際のコードは複雑です。ここでは、問題のより単純なバージョンを生成しようとしました。

4

1 に答える 1

0

レスポンスを生成するときは、ハイドレート メソッドが呼び出されると思います。したがって、あなたのテストは、テストするつもりだったものをテストしていないようです。

ハイドレートをハイドレートするとき、ハイドレータは 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 に答える