我正在使用CollectionType
字段。
$builder->add('urls', CollectionType::class, [
'allow_add'=>true,
'entry_type'=>UrlType::class,
'constraints'=>new All([
'constraints'=>[
new Url()
]
])
]);
它按我的预期工作。如果字段包含无效内容,则消息除外。
Validator工作但错误消息有点令人困惑:Field.0 - This value is not a valid URL address
。我需要的是简单地使父字段无效 - 将错误绑定到urls
字段。
当然,我可以创建一个表单侦听器并在那里执行验证。但是 - IMO - 它是一种解决方法。
如何在纯粹的"中实现这一目标。办法?我曾尝试过多次播放error_bubbling
,但它仍然不能令人满意。
答案 0 :(得分:0)
尝试,以便对每个UrlType进行强制验证,并将错误向上冒泡到父表单,CollectionType
$builder->add('urls', CollectionType::class, [
'allow_add'=>true,
'entry_type'=>UrlType::class,
'constraints'=>new All([
'constraints'=>[
new Url()
]
]),
'cascade_validation' => true,
'entry_options' => array('error_bubbling' => true)
]);
答案 1 :(得分:0)
我认为您需要设置error_mapping:
$builder->add('urls', CollectionType::class, [
'allow_add'=>true,
'entry_type'=>UrlType::class,
'constraints'=>new All([
'constraints'=>[
new Url()
]
]),
'cascade_validation' => true,
'error_bubbling' => false,
'error_mapping' => [
'your_parent_form_alias.field_name' => 'field_name',
]
]);
然后在构建违规时在UrlValidator中添加atPath,如下所示:
if (empty($form['field_name'])) {
$this->context->buildViolation($constraint->getMessageName())
->atPath('your_parent_form_alias.field_name')
->addViolation();
}
我不确定error_mapping和error_bubbling是否应首先映射为Url(),然后再映射一次以用于All()。
我希望它能帮到你