为什么自定义验证约束的错误不会附加到特定字段的表单?

问题描述:

我有一个ArticelPattern类,它有$ extraPatterns属性。该属性是ExtraPattern(类)元素的数组。为什么自定义验证约束的错误不会附加到特定字段的表单?

对ExtraPattern类(我使用注释应用)有一个自定义约束。

对于表单处理,我使用extraPatterns集合字段创建了一个ArticelPatternType类。

现在,当我验证此表单并且存在由ArticelPattern :: $ extraPatterns集合中的一个元素引发的约束违规时,错误未分配给该元素,而是分配给整个表单,所以我无法在导致此错误的相应表单字段旁显示此错误。

而不是把我的定制约束的ExtraPattern类,像这样:

/** 
* @AssertApl 
*/ 
class ExtraPattern 

我也试图把它放在集合属性,像这样:

/** 
* @Assert\All(@AssertApl) 
*/ 
private $extraPatterns; 

但同样的结果。由集合中的元素引起的@AssertApl约束错误不会分配给它们,而是分配给整个表单。

任何想法如何让它工作?

您的类约束可能被映射到form类型的表单,其默认情况下启用了error_bubbling。将此选项设置为false应该做你想要的。

$builder ->add('extraPatterns', 'collection', array(
    // ... 
    'options' => array('error_bubbling' => false), 
)); 
+0

'error_bubbling'=>错误的作品像魅力:)但有点奇怪,当我把@AssertApl约束直接放在集合元素类(而不是集合本身@Assert \ All)时,错误是仍然冒泡。 – JohnM2

属于类似的问题:在你的实体使用firstName,形成。不是first_name

如果您的实体(用户)具有类似firstName的字段,则表单构建器接受form_field(带下划线)字段命名。它可以正确保存数据等等。但是,如果您要为此字段添加一些自定义约束,请谨慎使用下划线:请勿使用它。使用camelCaseFieldNames insted,否则您会收到错误附加到窗体,而不是字段。

+0

太棒了!在这里你是一个关于它的官方讨论:https://github.com/symfony/symfony/issues/9162 –