给定形式:
...
$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 代码并更新了标题以澄清问题。