2016-02-10 3 views
2

Я строю API с Symfony 3, следуя спецификации API JSON (Documentation).Как изменить запрос перед отправкой данных в форму?

При подаче новых данных, запрос имеет следующий формат:

{ 
    "type": "entity", 
    "id" : null, 
    "attributes" : { 
    "name" : "Test name" 
    } 
} 

Но проблема в том, запрос не соответствует формату, ожидаемых форм Symfony это из-за дополнительного объекта attributes.

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

Я попытался зарегистрировать FormEvents:PRE_SUBMIT и выполнить логику, но, похоже, у меня нет доступа к содержимому Запроса.

$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) { 
      $data = $event->getData(); 

      var_dump($data); 
      die(); 
     }); 

$event->getData() является null.

У меня также есть возможность зарегистрировать DataTransformer, но он зарегистрирован в поле и не имеет доступа к запросу.

Я не хочу делать это вручную в контроллере, поскольку это произойдет во всех моих формах (или, по крайней мере, в большинстве случаев), поэтому я ищу более общий способ преобразования запроса, но на данный момент я не могу понять, как это сделать.

Спасибо за помощь.

ответ

2

Ваш EventListener не имеет доступа к вашему Request, а также ваш Form.

Самый лучший и чистый способ сделать это на мой взгляд, было бы определить пользовательские RequestHandler для Forms, расширяя NativeRequestHandler, который анализирует ваш Request по умолчанию.

Тогда вам нужно выполнить только $builder->setRequestHandler(), чтобы применить это к вашим формам.

+0

Это именно то, что я ищу. Я прочитал всю документацию по Symfony 2 и CookBook, и я не могу вспомнить, что это объясняет, что вы можете это сделать. Это новая функция Symfony 3 или она просто не документирована? – Elorfin

+0

Не документировано, похоже, это похоже на то, что Symfony 2.3 – Terenoth

+0

Недостатком является то, что мне нужно будет дублировать некоторую внутреннюю логику (например, '$ _FILES' и проверку метода), поскольку все методы являются« частными ». Просто небольшой недостаток, поскольку он чище всех решений, которые я думал. – Elorfin