Forms 根据数组Symfony2验证选择字段

Forms 根据数组Symfony2验证选择字段,forms,symfony,validation,Forms,Symfony,Validation,我正在Symfony2建立一个表单类。在我的班上,我有一个选择领域。我构建了一个函数来返回我的选择数组: public function getCardTypes() { return array('visa' => 'Visa', 'mc' => 'MasterCard', 'amex' => 'American Express'); } 稍后,我将使用此数组向表单中添加一个选项字段: $builder->add('PaymentCCType', 'choi

我正在Symfony2建立一个表单类。在我的班上,我有一个选择领域。我构建了一个函数来返回我的选择数组:

public function getCardTypes()  {
    return array('visa' => 'Visa', 'mc' => 'MasterCard', 'amex' => 'American Express');
}
稍后,我将使用此数组向表单中添加一个选项字段:

$builder->add('PaymentCCType', 'choice', array('choices' => $this->getCardTypes()));
然后在getDefaultOptions函数中,我对该字段有一个选择约束:

'PaymentCCType' => new Choice(array('choices' => $this->getCardTypes())),
我似乎对这个验证器有问题。当我提交此表单时,我的选择框下面出现以下错误:“您选择的值不是有效的选择”。当然,我正在使用数组中的一个选项

我做错了什么

/*编辑*/

我注意到,在这4个字段中,我只得到其中3个字段的错误。选择月份(简单的1-12)时,验证有效

/*编辑2*/

当数组键与值不匹配时,似乎会出现此问题。我将阵列切换到
阵列(“Visa”=>“Visa”、“万事达卡”=>“万事达卡”、“美国运通”=>“美国运通”)
现在它可以工作了。
这有什么办法吗?我觉得我不可能是唯一一个有这个问题的人。即使您有一个常规(非关联)数组,如
array('Visa','MasterCard','American Express')
也会发生这种情况。如果您应该以不同的方式执行此操作,请使用以下方法创建具有ChoiceListInterface的类:

public function getChoices() 
{   
    return self::$choices;  
}

public static function getTypeChoicesKeys() 
{
    return array_keys(self::$choices);
}
形式类:

$builder->add('type', 'choice', 
        array(
            'expanded' => true, 
            'multiple' => false,
            'choice_list' => new TypeChoices(),
            'required' => true,
        )
      )
在validation.yml中

    type:
        - NotNull: ~
        - Choice: { callback: [TypeChoices, getTypeChoicesKeys] }  
编辑 在回答我的问题时,Symfony团队指出,选择验证程序接受一组可能的值(而不是像选择字段这样的可能选择)。最简单的方法是使用array_keys函数:


'PaymentCCType'=>新选项(数组('choices'=>数组_键($this->getCardTypes()),

我认为您不必在getDefaultOptions方法中添加此选项。用
$builder->add(…)
代码试试你的表单。@AdrienBrault我在这里遵循这个指南:我觉得这有点可笑。我必须在一个新文件夹中创建一个单独的类文件,以创建/验证一个带有3个选项的select?我第一次感觉也是这样。现在我不在乎了。这对一些事情来说是有意义的(特别是像country这样的大型选择集),但在这里我真的试图将表单全部保存在一个地方。如果你要本地化等。使用单独类的应用程序很有意义这正是我所需要的。非常感谢您的帖子:)