2014-09-03 2 views
1

Я строю REST API с FOSRestBundle в Symfony2. Я использую формы для создания и обновления объектов с помощью Doctrine2. Все работает нормально, если я отправляю все поля формы. Пример:Symfony2 REST API - Частичное обновление

{"first_name":"Pi","last_name":"Wi"} 

Лицо вставлено нормально, но теперь я хочу обновить только фамилию.

{"last_name":"Wi"} 

Проблема заключается в том, что первое имя пустое после обновления, потому что форма обновляет объект с «нулевым» значением (потому что не дано). Можно ли просто обновить фамилию и игнорировать первое имя?

ответ

8

Несомненно, это возможно.

Во-первых, с точки зрения RESTful, который был бы запросом PATCH, поэтому, если вы используете the ClassResourceInterface based controller approach, вам нужно добавить метод patchAction в ваш контроллер.

Затем при обработке отправленной формы, вам необходимо пройти false$clearMissing возможности представить вызов метода вашей формы в контроллере, например:

<?php 
// in your controller's patchAction: 

/** @var \Symfony\Component\Form\FormInterface $form */ 
/** @var \Symfony\Component\HttpFoundation\Request $request */ 

$form->submit($request, false); 

Это покажет, как компонент формы только обновите поля, переданные из формы, не очищая отсутствующие поля (как говорит имя параметра). См. source code для справки.

Обратите внимание, что передача Request в FormInterface::submit() метод будет устаревшим с Symfony 3.0, поэтому этот ответ предназначен для Symfony 2.x.

+0

из документов: «Метод' submit() 'устарел и будет удален в Symfony 3.0" – NDM

+0

@NDM, можете ли вы дать точную ссылку? Единственное, что я нашел на 'submit()', это то, что >> Передача запроса непосредственно для отправки() по-прежнему работает, но устарела и будет удалена в Symfony 3.0. См. Http://symfony.com/doc/current/cookbook/form/direct_submit.html#passing-a-request-to-form-submit-deprecated – kix

+1

Спасибо! Но, это устарело ;-) Однако вы дали мне правильные ключевые слова, чтобы выполнить новый поиск Google, и я нашел это в StackOverflow: http://stackoverflow.com/questions/19793767/does-symfony-2-support-partial -форма связывания. Вы можете использовать handleRequest и убедиться, что метод запроса «PATCH». Поскольку большинство браузеров не отправляют запрос PATCH, вы можете переопределить метод, используя '_method'. Тогда это работает из коробки! :-) Я принимаю ваш ответ, потому что это лучший из двух. –

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