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? Это должно придерживаться ваших потребностей.