CollectionType元素验证错误消息位置

时间:2016-04-15 14:06:31

标签: symfony symfony-forms

我正在使用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,但它仍然不能令人满意。

2 个答案:

答案 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()。

我希望它能帮到你