Symfony 3.4 — Api Rest изменяет значение

У меня простая проблема! Я не знаю, как установить значение $ email, которое находится в таблице с именем profile, и эта таблица профиля связана с таблицей пользователя (многие к одному). Поэтому я успешно добавляю пользователя методом POST:

{
"username": "TestTest10",
"password": "TestTest10",
}

После этого я автоматически создаю объект профиля, связанный с пользователем, но помещаю информацию о профиле вручную, поэтому он создает пользователя, которого я хочу, но профиль, связанный с этим аккаунтом, всегда одинаков для любого пользователя (все имеют адрес электронной почты ok @ ok.com) (вот так:

$profile = new Profile();
$profile->setEmail('ok@ok.com');
$user->setIdProfile($profile);
$em = $this->getDoctrine()->getManager();
$em->persist($profile);
$em->flush();

Но я хочу отредактировать его с помощью этого метода POST:

{
"username": "TestTest10",
"password": "TestTest10",
"email": "imanoob@symfony.com"}

Так как я могу это сделать?

Моя функция PostUser:

/**
*
* @Rest\Post(
*     path = "/users",
*     name = "api_users_add"* )
* @Rest\View(StatusCode=201, serializerGroups={"user_detail"})
* @ParamConverter(
*     "user",
*     converter="fos_rest.request_body",
*     options={"deserializationContent"={"groups"={"Deserialize"}}}
* )
*/
public function postUserAction(Request $request, User $user, ConstraintViolationListInterface $violations)
{
if (count($violations) > 0) {
return new JsonResponse([
'success' => "false",
]);
}

$profile = new Profile();

$profile->setEmail('ok@ok.com');
$profile->setLastConnexion(new \DateTime('now'));
$profile->setCreatedAccount(new \DateTime('now'));
$profile->setBirth(new \DateTime('now'));

$user->setIdProfile($profile);

$em = $this->getDoctrine()->getManager();
$em->persist($profile);
$em->flush();

$this->encodePassword($user);
$user->setRoles([User::ROLE_USER]);

$this->persistUser($user);

return new JsonResponse([
'success' => "true",
'data' => [
'Id' => $user->getId(),
'username' => $user->getUsername(),
'email' => $profile->getEmail(),
]
]);
}

Я могу получить профиль в параметре:

    public function postUserAction(Request $request, User $user, Profile $profile, ConstraintViolationListInterface $violations)

Но я не знаю, как поместить два paramConverter в:

* @ParamConverter(
*     "user",
*     converter="fos_rest.request_body",
*     options={"deserializationContent"={"groups"={"Deserialize"}}},
* )

Спасибо за все, что постараюсь ответить: p

1

Решение

Хорошо, ребята, если у кого-то такая же проблема, то ответ очень прост, но вам нужно это сейчас: вам нужно поставить два преобразователя параметров следующим образом:

* @Rest\View(StatusCode=201, serializerGroups={"user_detail"})
* @ParamConverter(
*     "user",
*     converter="fos_rest.request_body",
*     options={"deserializationContent"={"groups"={"Deserialize"}}},
* )
* @ParamConverter(
*     "profile",
*     converter="fos_rest.request_body",
*     options={"deserializationContent"={"groups"={"Deserialize"}}},
* )

Весь код выглядит так:

/**
*
* @Rest\Post(
*     path = "/users",
*     name = "api_users_add"* )
* @Rest\View(StatusCode=201, serializerGroups={"user_detail"})
* @ParamConverter(
*     "user",
*     converter="fos_rest.request_body",
*     options={"deserializationContent"={"groups"={"Deserialize"}}},
* )
* @ParamConverter(
*     "profile",
*     converter="fos_rest.request_body",
*     options={"deserializationContent"={"groups"={"Deserialize"}}},
* )
*/
public function postUserAction(Request $request, User $user, Profile $profile, ConstraintViolationListInterface $violations)
{
if (count($violations) > 0) {
return new JsonResponse([
'success' => "false",
]);
}
$profile->setLastConnexion(new \DateTime('now'));
$profile->setCreatedAccount(new \DateTime('now'));
$profile->setBirth(new \DateTime('now'));

$user->setIdProfile($profile);

$em = $this->getDoctrine()->getManager();
$em->persist($profile);
$em->flush();

$this->encodePassword($user);
$user->setRoles([User::ROLE_USER]);

$this->persistUser($user);

return new JsonResponse([
'success' => "true",
'data' => [
'Id' => $user->getId(),
'username' => $user->getUsername(),
'email' => $profile->getEmail(),
]
]);
}
1

Другие решения

Других решений пока нет …