使用 Symfony 表单组件处理带有多个复选框的表单

Processing form with multiple checkboxes using Symfony form component

作为 Silex 应用程序的一部分,我有一个带有多个复选框的表单,以便用户可以从列表中选择一个或多个选项。我导入 symfony/form 组件来处理后端表单处理。

我正在编写 HTML 用于手动显示表单,因为它显示在 table 中,我不确定如何让 form_widget 助手实现这一点(它是当我只想要一个显示 'as is') 的表单时很好。

每个复选框的代码是(plan.id 是每个计划的唯一 ID):

<input type="checkbox" name="plans[]" value="{{ plan.id }}">

我苦恼的部分是如何处理数据。目前我的路线中的代码是:

$form_builder = $app['form.factory']->createBuilder(FormType::class);

foreach ($plans as $plan) {
  $form_builder->add("plans[]", CheckboxType::class);
}

$form = $form_builder->getForm();

$form->handleRequest($request);

$data = $form->getData();

但是,当我提交表单时出现以下错误:

The name "plans[]" contains illegal characters. Names should start with a letter, digit or underscore and only contain letters, digits, numbers, underscores ("_"), hyphens ("-") and colons (":").

我在不使用框架的情况下处理包含名为 foo[] 的元素的表单时从未遇到过问题。是否可以使用 Symfony 表单获得相同的结果,或者我是否需要重新考虑我是如何做的?

来自 composer show 的相关版本是:

silex/silex               v2.0.4             The PHP micro-framework based
symfony/form              v3.2.2             Symfony Form Component
symfony/validator         v3.2.2             Symfony Validator Component

您应该对一组复选框使用 collections

use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
// ...

$builder->add('plans', CollectionType::class, array(
    'entry_type'   => CheckboxType::class,
    // these options are passed to each "checkbox" type
    'entry_options'  => array(
        'attr'      => array('class' => 'check-box')
    ),
));

尽管进行了多次尝试,但我无法使任何提议的 answers/comments 发挥作用。

最后,我只是为每个复选框添加了一个唯一的名称 ("plans_" + plan.id),而不是尝试创建一个具有相同名称的复选框数组。它不像处理数组那样干净,我不知道为什么这在 Symfony 中如此麻烦,但它有效。