Symfony2表单:自动为必填字段添加NotBlank约束和Bootstrap Validator消息

时间:2014-12-09 22:17:00

标签: php forms validation symfony symfony-forms

在Symfony2中使用必需字段的验证和自定义错误消息构建表单时,我手动必须为客户端验证指定NotBlank约束和自定义错误消息属性(使用Bootstrap Validator)。每个表单字段的代码都是这样的:

$builder->add('name', 'text', array(
    'required' => true,
    'constraints' => array(
      new NotBlank(array('message' => 'Bitte geben Sie Ihren Namen ein.')),
    ),
    'attr' => array(
      // This is for client side bootstrap validator
      'data-bv-notempty-message' => 'Bitte geben Sie Ihren Namen ein.'
    )
));

我正在寻找的是通过仅指定required_message一次来缩短它的可能性:

$builder->add('name', 'text', array(
    'required_message' => 'Bitte geben Sie Ihren Namen ein.'
));

我希望构建器创建NotBlank约束和data-bv-notempty-message属性。

实现这一目标的最佳方法是什么?通过创建表单类型扩展名?

1 个答案:

答案 0 :(得分:1)

我目前使用的解决方案如下:在我的表单的类型类中(或者在Controller类中,如果在没有Type类的情况下动态创建表单),我添加了一个私有函数addRequired用于添加所需的字段,如:

class MyFormWithRequiredFieldsType extends AbstractType
{
    private $builder;
    private function addRequired($name, $type = null, $options = array())
    {
        $required_message = 'Bitte füllen Sie dieses Feld aus';
        if (isset($options['required_message'])) {
            $required_message = $options['required_message'];
            unset($options['required_message']);
        }
        $options['required'] = true;
        $options['attr']['data-bv-notempty-message'] = $required_message;
        if (!isset($options['constraints'])) {
            $options['constraints'] = array();
        }
        $options['constraints'][] = new NotBlank(array(
            'message' => $required_message
        ));
        $this->builder->add($name, $type, $options);
    }
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $this->builder = $builder;
        $this->addRequired('name', 'text', array(
            'required_message' => 'Bitte geben Sie Ihren Namen ein'
        ));
    }
}

这有效,但我不喜欢这个解决方案,因为要添加必填字段,我必须调用$this->addRequired()而不是$builder->add(),因此我放弃了链接{{1}的可能性}}调用。这就是我正在寻找透明覆盖add()方法的解决方案的原因。