Как получить связанные сущности для сущности?

Я разрабатываю API обмена сообщениями, и я установил PUT /message метод.

Полезная нагрузка состоит из массива, содержащего три поля: message, sender а также receiver — первое — это само сообщение, и каждое из следующих полей является представлением пользователя. Полезная нагрузка может быть что-то вроде:

{
"message": "Hi!",
"sender": { "id": 1 },
"receiver": { "id", 2 }
}

Используя JMSSerializerBundleЯ мог бы успешно перевести полезную нагрузку в Message сущность и ее пользователи в их соответствующие User юридические лица. Это Message юридическое лицо:

/**
* @ORM\Entity
*/
class Message
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;

/**
* @ORM\ManyToOne(targetEntity="User")
* @ORM\JoinColumn(name="sender", referencedColumnName="id", nullable=false)
*/
protected $sender;

/**
* @ORM\ManyToOne(targetEntity="User")
* @ORM\JoinColumn(name="receiver", referencedColumnName="id", nullable=false)
*/
protected $receiver;
}

Я хочу получить полезную нагрузку и сохранить ее в базе данных. Не больше, не меньше. Контроллер выглядит следующим образом:

/**
* @Configuration\Method("PUT")
* @Configuration\Route("/message")
*/
public function putMessageAction(Request $request)
{
/** @var Message $message */
$message = $this
->getJMSSerializer()
->deserialize($request->getContent(), 'Message', 'json');

// at this point I want both sender and receiver to be two database users

if ($message->getSender()->getId() === $message->getReceiver()->getId()) {
throw new \Exception("A message's sender and receiver cannot be the same people.");
}

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

return JsonResponse::create([
'message' => 'Message successfully received.'
], 200);
}

Я сократил пространства имен только для того, чтобы сосредоточиться на самой проблеме. Ничего страшного в этом нет. 🙂

0

Решение

По запросу, это решение не на основе JMSSerializer. Не испытано.

// Turn json payload into an array
$data = json_decode($request->getContent(),true);

// Load references to users, no need to load the entire object in
$em = $this->getDoctrine()->getManager();
$sender   = $em->getReference('User',$data['sender'];
$receiver = $em->getReference('User',$data['receiver'];

// Build and persist the message
$message = new Message(); // or new Message($sender,$receiver,$data['message']);
$message->setSender($sender);
$message->setReceiver($receiver);
$message->setMessage($data['message']);

$em->persist($message);
$em->flush();

Также возможно сделать такое отображение с формами.

И хотя это немного не по теме, если вы пытаетесь создать REST-подобный интерфейс, то POST, вероятно, является лучшим решением для создания нового ресурса. И возвращение кода состояния 201 вместе со ссылкой для перенаправления на новый ресурс также более типично.

0

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

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

По вопросам рекламы [email protected]