FormBuilderInterface->add() 方法的 $child 参数中的非法字符

Illegal characters in $child param of FormBuilderInterface->add() method

我正在尝试为一页上的许多用户创建一个可以更改用户角色的表单。 用户具有唯一的电子邮件和 ID。但是,当我尝试将 $child 参数添加到包含用户电子邮件的表单时:

$form->add($user->getEmail(), ChoiceType::class, [
                'choices' => $options,
                'placeholder' => 'Select role',
                'data' => $defaultValue,
            ]);

...我得到一个错误:

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

如果我添加用户名而不是电子邮件,这个问题就会消失:

$form->add($user->getUsername(), ChoiceType::class, [
                'choices' => $options,
                'placeholder' => 'Select role',
                'data' => $defaultValue,
            ]);

...但是相同的用户名可以有很多。

如何将用户的电子邮件或用户 ID 传递到表单以确保所选角色的值与特定用户相关?

FormBuilder::add 的第一个参数基本上 只是一个名称 ,但该名称必须符合一些限制,特别是它不包含特殊字符(包括下划线)。它通常也用作正在 edited/set/...

的实体的字段名称

在您的情况下,我看不到这个特定字段名称(电子邮件地址)的原因。你试过 'email' 吗?

$form->add('email', ChoiceType::class,
     //...
);

我假设 (d) 您想要一个字段 select 一封电子邮件。否则,请使用 CollectionType 形式,正如 Vyctorya 在评论中所建议的那样。

我找到了解决办法。我将用户 ID 值传递给 $child 参数,并使用 "label" 选项在客户端替换它。

$form->add($user->getId(), ChoiceType::class, [
                'choices' => $options,
                'placeholder' => 'Select role',
                'data' => $defaultValue,
                'label' => $user->getEmail(),
            ]);

所以我有一个漂亮的返回数组,如下所示:

['1' => 'role1',
 '2' => 'role2',
 '3' => 'role3',]

但是,在客户端,一切都很清楚,因为 ID 已被用户的电子邮件替换。