【发布时间】:2019-11-14 16:06:09
【问题描述】:
我正在与Symfony 3.4 合作,并想创建一个简单的表单,其中显示可以使用复选框选择删除的列表实体:
- 创建和处理表单的控制器从数据库中加载实体列表,然后将其添加到表单中。
- 控制器使用一些附加参数来提供分页,例如如果数据库中有 10.000 个实体,则用户可以选择仅加载前 50 个。
问题是,“前 50 个实体”取决于实体是否已被删除/表单是否已被处理。
- 要在控制器中处理表单,我必须先创建它
- 要创建表单,我需要从数据库中加载实体列表以将它们设置为
choises - 此列表将包含前 50 个实体
- 如果用户选择删除前 10 个实体,则在处理表单时完成。
class SomeController
{
public function deleteUsersAction(Request $request)
{
$users = $this->loadUsersFromDB(50);
$form = $this->creatFormBuilder()
->add('users', EntityType::class, [
'class' => 'AppBundle:User',
'choices' => $users, // $users are added here
'multiple' => true,
'expanded' => true,
])
->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$users = $form->getData();
$this->deleteUsers($user);
// Load the now first 50 users
$users = $this->loadUsersFromDB(50);
// How to add these users to the form??
}
return $this->render('AppBundle::user_list.html.twig', ['form' => $form->createView()]);
}
}
提交的用户被删除后如何为表单设置正确的用户?
编辑
为了回答来自 cmets 的问题,我提供了一个小例子:
- 假设表单显示前 5 个用户。
- 第一次调用页面时,表单未提交。控制器加载以下第一个用户,使用它们创建表单并显示页面:
- 鲍勃
- 爱丽丝
- 迈克
- 约翰
- 比尔
- 在页面上,用户选择 Bob 和 Alice 进行删除并提交表单。
- 再次调用控制器,加载前 5 个用户的列表以创建表单。此列表与之前完全相同。
- 但是,由于现在提交了表单,因此处理了数据并删除了 Bob 和 Alice。
- 现在我们无法返回创建的表单,因为它仍然包含 Bob 和 Alice 的条目...
- 我们必须再次运行
$users = $this->loadUsersFromDB(5)才能得到正确的结果,比如 - 迈克
- 约翰
- 比尔
- 吉姆
- 汤姆
问题:
- 用户列表必须在创建表单之前加载,因为我们需要这个列表来创建表单。
- 必须创建表单以便我们处理它
- 处理表单确实会更改用户列表
- 因此,在处理完表单后,我们需要再次加载用户列表。
所以:在处理表单之前加载用户列表是必要的工作,因为处理表单时列表会发生变化。
如何避免这项工作?
当然,在示例中加载 5 个用户没什么大不了的,但在实际代码中,这可能是数百个大量实体,并且两次运行相同的代码可能会对性能产生重大影响。
【问题讨论】:
-
最简单的解决方案是重新创建表单。
-
什么是“提交表单后设置正确的用户”是什么意思?如果你打算加载接下来的 50 个用户,这真的很容易,只需 return $this->redirectToRoute(YOUR_ROUTE);在 iIF 语句中,您将拥有一个包含新数据的干净页面。
-
@AlexanderDimitrov 在处理表单之前加载用户列表是完全不必要的工作,因为处理表单时此列表会发生变化。我在编辑问题时试图澄清。