2016-11-25 3 views
0

У меня есть приложение REST Symfony 3.1, которое использует сериализованные объекты JSON от клиента, которые десериализуются обратно в объекты сущности в Symfony.form validation inested json object

Проблема у меня в том, что у User есть внешний ключ для таблицы Status. Когда я пытаюсь создать пользователя, я должен POST JSON в следующем формате:

{"firstname": "Jane", "lastname": "Doe", "status": "1"}

Однако, я хотел бы представить JSON в формате ниже вместо этого. Я хотел бы взять часть idstatus JSON в приведенном ниже примере, чтобы вставить в столбец внешнего ключа. Клиент, отправляющий запрос, уже имеет объекты с этим форматом и сериализует их, и отправка его таким образом будет чрезвычайно простой и простой в использовании.

{"firstname": "Jane", "lastname": "Doe", "status": {"id": 3, "type": "Pending"}

Я не знаю, с чего начать. Я думаю об трансформаторах данных, но я не совсем уверен, как заставить его принять формат JSON, который я хочу, а также проверить его в одно и то же время.

NewUserType.php

class NewUserType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('firstname') 
      ->add('lastname') 
      ->add('status') 
     ; 
    } 

DefaultController.php

public function postNewUserAction(Request $Request) 
{ 
    $form = $this->createForm(NewUserType::class, new User()); 
    $form->submit($Request->request->all()); 
    ...//validate and persist... 
} 

User.php

class User 
{ 
/** 
* @ORM\ManyToOne(targetEntity="Status") 
* @ORM\JoinColumn(name="statusid", referencedColumnName="id") 
*/ 
private $status; 

Status.php

class Status 
{ 
    ... 
    private $id 
    ... 
    private $type; 

Таблица Пользователь

mysql> select * from user; 
+----+----------+-----------+----------+ 
| id | statusid | firstname | lastname | 
+----+----------+-----------+-----------+ 
| 1 |  3 | Jane  | Doe  | 

таблица Статус

id type 
3 Pending 
+0

Является ли таблица состояния уже заполненной данными, а при вставке нового пользователя вы просто выбираете соответствующий статус для этого пользователя? –

+0

@ MatkoĐipalo Да, таблица пользователя хранит только идентификатор из 'Status' в столбце' statusid'. Я просто добавил обзор таблицы в моем вопросе. – Tek

ответ

1

Одна вещь, которую вы могли бы использовать это слушателем форма события (https://symfony.com/doc/current/form/events.html)

В контроллере преобразовать данные запроса JSON в массив:

public function postNewUserAction(Request $Request) 
{ 
    $data = json_decode($Request->getContent(), true); 
    $form = $this->createForm(NewUserType::class, new User()); 
    $form->submit($data); 
    if (!$form->isValid()) {... 
} 

FormType:

class NewUserType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('firstname') 
      ->add('lastname') 
      ->add('name') 
      ->add('status', EntityType::class, array(
        'class' => 'YourBundle:Status', 
        'choice_label' => 'id', 
       )) 
     ; 

     $builder->addEventListener(
       FormEvents::PRE_SUBMIT, 
       array($this, 'onPreSubmitData') 
      ); 
    } 

    public function onPreSubmitData(FormEvent $event) 
    { 
     $eventData = $event->getData(); 
     $status = $eventData['status']; 
     unset($eventData['status']); 

     $eventData['status'] = $status['id']; 
     $event->setData($eventData); 
    } 

В методе onPreSubmitData, вы можете просто адаптировать данные из запроса для ваших нужд :)

+0

Знаете, я все время использую события формы, и не раз я думал, что могу использовать их для этого. Вы, сэр, джентльмен и ученый. Спасибо! Однако мне не пришлось преобразовывать данные JSON в массив.Кажется, что форма 'submit()' также заботится об этом. – Tek

+0

Я рад, что смогу помочь вам :) –