jmsserialize не десериализует сущность OneToOne правильным способом

У меня есть две сущности: User а также UserInfo:

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. Все работает нормально если UserInfo не указано Пользователь загружается из БД, а отправленные поля обновляются:

Отправив:

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

То, что я получаю десериализованным, является хорошо загруженным пользователем и 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 обновляется и сериализуется, но все остальные поля не будут загружены из БД, устанавливая все их в null, Это не то поведение, которое я хотел бы получить. Как я могу это исправить?

Обновить

Я подумал, что мне лучше исправить один "уровень вложенности", если я хочу сделать это правильно. URL может напоминать это (аннотация контроллера FOSRestbundle):

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

таким образом, я могу пропатчить userInfo, следуя совету Ocramius. Кто-нибудь может дать мне отзыв об этом? Как вы думаете, это может быть хорошей / лучшей практикой для реализации достойного патча?

1 ответ

JMSSerializer не предназначен для того, чтобы ваши сущности были как можно ближе к базе данных. Вы можете сделать простую сериализацию или десериализацию. Есть несколько примеров кода, где пользователи создают фабрики для достижения вашей цели.

Вы пытались объединить вашу десериализованную сущность в EntityManager? Это должно придерживаться ваших потребностей.

Другие вопросы по тегам