2014-10-01 3 views
0

Я разрабатываю 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

И можем ли мы предположить, что он не работает? У вас есть JMSSerializerBundle, сконфигурированный для фактического вытягивания существующих сущностей отправителя/получателя из базы данных? – Cerad

+0

@Cerad да, это не работает. Когда я получаю сообщение, оба приемника и отправителя пусты, поэтому я не могу просто сохранить сообщение сразу. Я не знаю, что делать для JMSSerializer, чтобы принести мне связанные объекты. У вас есть какие-то намеки? – rodrigorigotti

+0

Я могу показать вам, как это сделать без JMSSerializer, если хотите. Я обнаружил, что пучки были несколько сконструированы и запутаны, поэтому я прекратил использовать его. В противном случае, загляните в документацию или дождитесь, когда кто-то, кто знаком с комплектом, остановится. – Cerad

ответ

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(); 

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

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

+0

Вы правы, говоря, что «POST» - правильный метод, но не потому, что я создаю ресурс, а потому, что это метод, не являющийся idempotent. Каждый раз, когда я отправляю сообщение, вы меняете состояние моей базы данных. Я попробую эту реализацию. :) – rodrigorigotti

Смежные вопросы