web-dev-qa-db-ja.com

Symfony Serializerでオブジェクトの配列を逆シリアル化するにはどうすればよいですか?

プロパティ内のオブジェクトの配列を逆シリアル化することはSymfony Serializerで可能ですか? Bossオブジェクトの配列を保持する必要がある$Npc = []プロパティを持つNpcクラスがあります。ドキュメントにいくつかの例を見ましたが、彼らはこの機能を述べていません。 NPCの配列を含むjson文字列があります。例:

class Boss {

    private $Npc = [];    

    /**
    * @return Npc[]
    */
    public function getNpcs(): array
    {
        return $this->npcs;
    }
}

私はphp7.1とsymfony/serializerバージョン^ 3.3を使用しています。

編集:すでにPhpDocExtractorを試しましたが、インストールできませんでした。 :(

編集:これは可能なJSON値です:

{
    "bossname": "Epic boss!",
    "npcs": [{
        "id": 24723,
        "name": "Selin Fireheart",
        "urlSlug": "selin-fireheart",
        "creatureDisplayId": 22642
    }]
}
10
Mike Rovers

私はこれを行う方法を見つけました:)。 Composerを使用してSymfony PropertyAccessパッケージをインストールしました。このパッケージでは、アダー、リムーバー、ハッサーを追加できます。このようにして、symfonyシリアライザーは自動的に正しいオブジェクトで配列を埋めます。例:

private $npcs = [];

public function addNpc(Npc $npc): void
{
    $this->npcs[] = $npc;
}

public function hasNpcs(): bool
{
    return count($this->npcs) > 0
}

等.

このようにして、ObjectNormalizerを以下で使用できます。

$normalizer = new ObjectNormalizer(null, null, null, new ReflectionExtractor());

編集:少なくともv3.4以降、リムーバーメソッドも作成する必要があります。それ以外の場合は機能しません(エラーや警告はありません)。

8
Mike Rovers

結果を得ることなく、私はこれに何時間も苦労してきました。加算関数を追加するたびに、objectnormalizerはこの関数を呼び出す必要がありましたが、「フィールドxyzはタイプxyz []、配列が指定されている必要があります」のようなエラーが発生しました。

これが、シリアライザのノーマライザプールにArrayDenormalizerを追加するのを忘れていた原因です。これを追加した後、すべてがうまくいきました。

これが誰かのために役立つことを願っています。

4
Jim Panse