FOSRestBundle - ИСПРАВЛЕНИЕ не работает должным образом

Я хочу обновить объект с помощью метода «ИСПРАВЛЕНИЕ» (обновить только те поля, которые были отправлены).

  /* Edit an existing Content entity.
  *
  * @Rest\Patch(
  *     "/{content}.{_format}",
  *     requirements={"content" = "\d+"},
  *     defaults = { "_format" = "json" }
  * )
  *
  * @Rest\View(serializerGroups={"user""admin"})
  * @param Content $content
  * @return View
  * @throws \NotFoundHttpException*
  *
  * @ApiDoc(
  *  resource="/api/content/",
  *  description="Updates content data",
  *
  *  input="ContentBundle\Form\ContentType",
  *
  *  output={
  *   "class"="EntriesBundle\Entity\Content",
  *   "parsers"={"Nelmio\ApiDocBundle\Parser\JmsMetadataParser"},
  *   "groups"={"user","admin"}
  *  }
  * )
  */
 public function editAction(Request $request, Content $content)
 {
     if (!$content) {
         throw $this-createNotFoundException();
     }

     $editForm = $this-createForm('ContentBundle\Form\ContentType', $content);
     $editForm-submit($request-request-get($editForm-getName()));

     $view = View::create()
         -setSerializationContext(SerializationContext::create()-setGroups(['user']));

     if ($editForm-isSubmitted() && $editForm-isValid()) {
         $em = $this-getDoctrine()-getManager();
         $em-persist($content);
         $em-flush();

         $view
             -setStatusCode(Codes::HTTP_OK)
             -setTemplate("ContentBundle:content:show.html.twig")
             -setTemplateVar('contents')
             -setData($content);

     } else {
         $view
             -setStatusCode(Codes::HTTP_BAD_REQUEST)
             -setTemplateVar('error')
             -setData($editForm)
             -setTemplateData(['message' = $editForm-getErrors(true)])
             -setTemplate('ContentBundle:content:show.html.twig');
     }

     return $this-get('fos_rest.view_handler')-handle($view);
 }

Форма:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('title', TextType::class)
        ->add('description', TextareaType::class)
        ->add('eng', CheckboxType::class, [
            'required' => false
        ]);
}

У меня есть объект с 'eng' установленным на TRUE. Если я запускаю запрос для обновления только поля title, eng меняется на false. и description на ноль. Есть идеи, почему?


person breq    schedule 10.04.2016    source источник
comment
При наличии запроса PATCH вы захотите передать false в качестве второго аргумента для Form::submit(), чтобы отсутствующие свойства не были очищены.   -  person xabbuh    schedule 11.04.2016
comment
Если вам случится обновить логическое значение до false с помощью PATCH, это может не сработать. См. этот вопрос для получения более подробной информации и решения: stackoverflow.com/questions/35187867/   -  person Roubi    schedule 16.04.2016


Ответы (2)


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

Попробуйте что-то вроде этого:

$editForm = $this->createForm(
   'ContentBundle\Form\ContentType', 
   $content, 
   ['method' => 'PATCH']
);
person chalasr    schedule 10.04.2016

У меня это работает.

Помните, ребята, что если вы хотите использовать метод PATCH, вам нужно использовать TextType вместо ChoiceType в вашей форме:

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title', TextType::class)
            ->add('description', TextareaType::class)
            ->add('eng', TextType::class);
    }
person breq    schedule 10.04.2016