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



我正在尝试为一个页面上的许多用户创建一个可以更改用户角色的表单。用户有唯一的电子邮件和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的第一个参数本质上只是一个名称,但该名称必须符合一些限制,特别是不包含特殊字符(包括下划线(。它通常还用作正在编辑/设置/…的实体的字段名。。。

在你的情况下,我看不出这个特定域名(电子邮件地址(的原因。你试过只使用'email'吗?

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

我假设(d(您想要一个字段来选择电子邮件。否则,请使用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已经被用户的电子邮件所取代。

相关内容

最新更新