Поля, отсутствующие в Запросе, устанавливаются равными нулю в сущности - PullRequest
0 голосов
/ 25 июня 2019

Я делаю отдых API-контроллер. У меня есть форма SliderApiType, в которой я передаю поля, которые я хочу редактировать. Если я пропущу только одно поле, например «label», то будет изменено только это поле, а все остальные поля в этой форме будут нулевыми.

Му форма:

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('label', TextType::class, ['label' => 'Заголовок', 'required' => false])
            ->add('description', TextType::class, ['label' => 'Описание', 'required' => false])
            ->add('serialNumber', IntegerType::class, ['label' => 'Номер', 'required' => false])
            ->add('picture', IntegerType::class, [
                'invalid_message' => 'picture is not a valid',
            ])
            ->add('send', SubmitType::class, ['label' => 'Отправить'])
        ;

        $builder->get('picture')
            ->addModelTransformer($this->transformer);
    }

Мой контроллер, в котором я выполняю действие редактирования:

    public function edit(Slider $slideId, Request $request, EntityManagerInterface $em)
    {
        $form = $this->createForm(SliderApiType::class, $slideId);
        $data = json_decode($request->getContent(), true);
        $form->submit($data);
        if (!($form->isSubmitted() && $form->isValid())) {
            return $this->handleView($this->view($form->getErrors(true)));
        }

        $em = $this->getDoctrine()->getManager();
        $em->persist($slideId);
        $em->flush();

        $context = new Context();
        $context->addGroup('slider_create');
        $view = $this->view($slideId);
        $view->setContext($context);

        return $this->handleView($view);
    }

Если передать эти поля в json:

{
  "label": "string",
  "description": "string",
  "picture": 1
}

Все работает хорошо!

Но если я передам этот JSON:

{
  "label": "string"
}

Поле «метка» задает как «строка», а поля «описание» и «картинка» устанавливает ноль.

Как сделать так, чтобы, если я пропустил поле, только оно было отредактировано, а два других поля не были нулевыми?

Ответы [ 2 ]

1 голос
/ 25 июня 2019

Я не написал никаких остальных API, но с небольшим поиском в Google похоже, что вы можете просто использовать второй параметр функции submit:

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

Предполагается, что ваша функция здесь используется только для обновления существующих данных объекта (метод PATCH / PUT) - если вы хотите поддерживать несколько методов в одном действии, вам необходимо проверить тип метода запроса:

$clearMissing = $request->getMethod() != 'PATCH';
$form->submit($data, $clearMissing);
0 голосов
/ 26 июня 2019

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

public function setField(string $newValue)
{
    if (!empty($newValue)) {
        $this->field = $newValue;
    }

    return $this;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...