0

私は2つのエンティティを持っています:UserUserInfo:

class User
{

    ...

    /**
     * @ORM\OneToOne(targetEntity="UserInfo")
     * @ORM\JoinColumn(name="userinfo_id", referencedColumnName="id_user")
     * @Serializer\Groups({"o", "i-self-editUser"})
     */
    private $userInfo;

    ...

}

class UserInfo
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id_user", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="SEQUENCE")
     * @ORM\SequenceGenerator(sequenceName="users_id_user_seq", allocationSize=1, initialValue=1)
     */
    private $idUser;

    ...

}

そして、JMSSerializer とその Doctrine Contructor によって送信された User を逆シリアル化しようとしています。が指定されていない場合、すべて正常に動作しUserInfoます。ユーザーが DB からロードされ、送信されたフィールドが更新されます。

送信する方法:

{
    "username": "test@test.us",
    "email": "test@test.us",
    "name": "test",
    "lang": "en-US"
}   

私が逆シリアル化されるのは、User と UserInfo が十分にロードされていることです。

しかし、次のようなものを送信しようとすると:

{
    "username": "test@test.us",
    "email": "test@test.us",
    "name": "test",
    "lang": "en-US"
    "user_info": {
        "short_date_format": "Y-m-dd"
    }
}   

short_date_formatは更新およびシリアル化されますが、他のすべてのフィールドは DB からロードされず、すべてが に設定されnullます。これは私が取得したい動作ではありません。どうすればこれを修正できますか?

アップデート

適切にやりたいのであれば、単一の「ネストレベル」にパッチを当てたほうがいいと思いました。URL は次のようになります (FOSRestbundle コントローラーの注釈)。

* @Patch("/users/{username}/userInfo", requirements={"username"=".+(\.)?\w+"})

このようにして、Ocramius の提案に従って userInfoにパッチを当てることができます。誰かがこれについてフィードバックをくれますか? まともなパッチを実装するために、それが良い/ベストプラクティスになると思いますか?

4

1 に答える 1

0

JMSSerializer は、エンティティを可能な限りデータベースに近づけるようには作成されていません。簡単なシリアル化または逆シリアル化を行うことができます。ユーザーが目標を達成するためにいくつかのファクトリを作成するコードの例がいくつかあります。

逆シリアル化されたエンティティを EntityManager にマージしようとしましたか? それはあなたのニーズに固執する必要があります。

于 2016-09-26T19:48:11.753 に答える