Forms 如何在Symfony2中验证实体映射表单的子表单?

Forms 如何在Symfony2中验证实体映射表单的子表单?,forms,validation,symfony,doctrine-orm,symfony-2.0,Forms,Validation,Symfony,Doctrine Orm,Symfony 2.0,我有一个映射到实体的表单('data\u class'=>…)。我已经在实体的属性上设置了验证器(通过注释) 实体具有条令类型的属性(名称翻译)数组。我创建了一个由多个字段组成的自定义字段类型,这些字段在表单中分配给该字段。每个子表单的字段(类型为text)都通过validation\u constraint选项设置了验证器(NotBlank) 我在nameTranslations属性上尝试了各种验证注释,包括Valid()。我尝试了设置错误\u几乎在任何东西上冒泡。子表单(字段nametran

我有一个映射到实体的表单(
'data\u class'=>…
)。我已经在实体的属性上设置了验证器(通过注释)

实体具有条令类型的属性(
名称翻译
数组
。我创建了一个由多个字段组成的自定义字段类型,这些字段在表单中分配给该字段。每个子表单的字段(类型为
text
)都通过
validation\u constraint
选项设置了验证器(
NotBlank

我在
nameTranslations
属性上尝试了各种验证注释,包括
Valid()
。我尝试了设置错误\u几乎在任何东西上冒泡。子表单(字段
nametransflations
)根本不会得到验证

子窗体:

class TranslateableTextType扩展了AbstractType
{
私人$朗;
/**
*{@inheritardoc}
*/
公共函数构造($multilang)
{
$this->langs=$multilang->getLangs();
}
/**
*{@inheritardoc}
*/
公共函数buildForm(FormBuilder$builder,数组$options)
{
foreach($this->langs as$locale=>$lang)
{
$builder->add($locale,'text',数组)(
'label'=>sprintf(“%s[%s]”,$options['label'],$lang),
“错误\u冒泡”=>true,
));
}
}
/**
*{@inheritardoc}
*/
公共函数getDefaultOptions(数组$options)
{
$constraints=[
“字段”=>[],
“allowExtraFields”=>true,
“allowMissingFields”=>true,
];
foreach($this->langs as$locale=>$lang)
{
$constraints['fields'][$locale]=newnotblank();
}
$collectionConstraint=新集合($constraints);
返回[
“验证约束”=>$collectionConstraint,
'标签'=>'',
“错误\u冒泡”=>true
];
}
/**
*{@inheritardoc}
*/
公共函数getParent(数组$options)
{
返回“表格”;
}
/**
*{@inheritardoc}
*/
公共函数getName()
{
返回“可翻译文本”;
}
}
主要形式:

$builder->add('nametransactions','translateable_text'[
“标签”=>“名称”
]);
在实体中:

/**
*@var数组
*
*@Assert\Valid
*@ORM\Column(type=“array”)
*/
受保护的美元翻译;
我认为您应该使用类型而不是自定义类型,或者您的自定义类型应该将集合类型定义为父类型

您可以使用如下验证程序:

/**
 * @Assert\All({
 *     @Assert\NotBlank
 * })
 * @ORM\Column(type="array")
 */
 protected $nameTranslations;

它将检查每个数组值是否不为空。

它不太适合于集合,字段的数量(大部分时间)是固定的。此外,我在另一个字段上遇到了完全相同的问题——即使我想转换,也无法将其转换为集合。我不明白为什么symfony不验证子表单,因为它的每个字段都有一个验证器,并且该子表单附加到的字段也有验证器(
ORM\validate
)。即使您的解决方案有效(现在无法在家中测试),它也会验证整个子表单——如果每个字段都单独处理(UX)会更好。这就是默认情况下不验证子窗体的原因。。。我不明白为什么固定数量的字段不适合集合类型。。。如果希望有多个子窗体(类型),则应使用集合类型。。。顺便说一句,即使您不使用集合,您也可以通过所有约束从
cascade\u validation
:您也可以使用模型中的有效约束来强制验证存储在属性上的子对象,而不是使用此选项。已尝试了
有效的
约束。就收款争议而言,我不能将收款用于具有相同问题的其他字段。集合不适用于许多字段,它更像是解决方法而不是解决方案。此问题已在以后的symfony版本中修复。我认为这是2.0中的一个bug。