0

给定形式:

...
        $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;
    }
...

通过添加值提交表单时......一切正常。但是当删除值时......这些值不会被删除,并且永远不会调用 setter。

奇怪的是,将表单方法切换为 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 代码并更新了标题以澄清问题。

4

2 回答 2

0

我不确定这是否是您的全部问题,但是当您处理表单提交时,您并没有保留实体。

$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

于 2019-06-26T16:49:03.113 回答
0

当涉及到数组时,这似乎PATCH是模棱两可的,并且有多种方法可以处理发送的数据。

Symfony 将在调用时检测 aPATCH而不是(不清空数据中缺少的实体中的字段)。当涉及到数组时,这是模棱两可的。$clearMissingsubmit()

为了解决这个问题,我不再使用 PATCH 来更新用户实体,而是使用了这个解决方案 Symfony2: Edit user without password

它本质上使用两种不同的 FormType 来创建用户,另一个来编辑它。每种表单类型使用不同的验证组。允许在不提交或清除用户密码的情况下编辑用户。

于 2019-07-01T11:27:36.567 回答