Symfony 4.3 Multiple ChoiceType может только добавлять значения и не удалять при использовании PATCH - PullRequest
0 голосов
/ 26 июня 2019

Данная форма:

...
        $builder
            ->add('testArray', ChoiceType::class, [
                'choices' => ['ROLE_ADMIN' => 'ROLE_ADMIN', 'ROLE_USER' => 'ROLE_USER'],
                'expanded' => true,
                'multiple' => true
            ])
        ;

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => TestEntity::class,
            'csrf_protection' => false,
            'method' => 'PATCH'
        ]);
    }

...

И сущность:

...
    /**
     * @ORM\Column(type="simple_array", nullable=true)
     */
    private $testArray = [];

    public function getTestArray(): ?array
    {
        return $this->testArray;
    }

    public function setTestArray(?array $testArray): self
    {
        $this->testArray = $testArray;

        return $this;
    }
...

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

Странно, переключение метода формы на GET исправляет это.

Что происходит?

--- редактировать ---

Вот контроллер, который воспроизводит эту проблему:

    /**
     * @Route("/{id}/edit", name="test_entity_edit", methods={"GET","POST","PATCH"})
     */
    public function edit(Request $request, TestEntity $testEntity): Response
    {
        $form = $this->createForm(TestEntityType::class, $testEntity);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $this->getDoctrine()->getManager()->flush();


            return $this->redirectToRoute('test_entity_index', [
                'id' => $testEntity->getId(),
            ]);
        }

        return $this->render('test_entity/edit.html.twig', [
            'test_entity' => $testEntity,
            'form' => $form->createView(),
        ]);
    }

---- редактировать ----

Тестирование с использованием POST это работает отлично. Но с помощью PATCH это не удается. Все остальные поля обновляются. И добавление в массив работает. Но удаление из массива не делает. Я добавил соответствующий код PATCH выше и обновил заголовок, чтобы прояснить вопрос.

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

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

Symfony обнаружит PATCH, а не $clearMissing при вызове submit() (не пустые поля в сущности, которые отсутствуют в данных). Когда дело доходит до массива, это неоднозначно.

Чтобы справиться с этим, я отошел от использования PATCH для обновления сущности пользователя и перешел к этому решению Symfony2: редактирование пользователя без пароля

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

0 голосов
/ 26 июня 2019

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

$this-getDoctrine()->getManager()->flush();

обычно пишется

$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($testEntity);
$entityManager->flush();

См. https://symfony.com/doc/current/best_practices/forms.html#handling-form-submits

...