Symfony 3.4 表单字段名称和带有选项 indexBy 的实体之间的冲突

Symfony 3.4 conflict between form field name and entity with option indexBy

我正在尝试创建一个表单,但似乎存在由 OneToMany 注释的选项 indexBy="label"

引起的冲突

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

其中 "Exemple frais" 是我实体的标签。

/**
 * User.
 *
 * @ORM\Table(name="user")
 * @ORM\Entity()
 */
class User extends BaseUser
{

    (...)

    /**
     * @var Frais[]
     *
     * @ORM\OneToMany(targetEntity="App\Entity\Frais", mappedBy="user",indexBy="label")
     */
    private $frais;

在这里,我的表单域:

->add(
            'frais',
            CollectionType::class,
            [
                'entry_type'   => FraisType::class,
                'allow_add'    => true,
                'allow_delete' => true,
                'by_reference' => false,
                'prototype'    => true
            ]
        )

即使我在 FraisType 中设置了下一个函数:

 public function getBlockPrefix()
{
    return 'frais';
}

/**
 * {@inheritDoc}
 */
public function getName()
{
    return 'frais';
}

/**
 * {@inheritDoc}
 */
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(
        [
            'data_class' => Frais::class
        ]
    );
}

我找到的唯一解决方案是将我的 CollectionType 更改为 EntityType。您知道避免我更改它的任何解决方案吗?

所以。我选择使用 "data" 表单域选项。 这不是我问题的真正答案,但它有效

            ->add(
                'frais',
                CollectionType::class,
                [
                    'entry_type'   => FraisType::class,
                    'allow_add'    => true,
                    'allow_delete' => true,
                    'by_reference' => false,
                    'prototype'    => true,
                    'data' => $this->em->getRepository(FraisDivers::class)->findBy(['user' => $this->user])
                ]
            )

这种方式可以防止通过关系 link 获取 Frais 实体并防止 indexOf 选项混乱。