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

时间:2013-01-11 18:47:55

标签: forms validation symfony doctrine-orm symfony-2.0

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

该实体具有学说类型nameTranslations的属性(array)。我创建了一个自定义字段类型,由多个字段组成,这些字段分配给表单中的此字段。每个子表单的字段(类型为text)都通过NotBlank选项设置验证器(validation_constraint)。

我在nameTranslations属性上尝试了各种验证注释,包括Valid()。我几乎尝试了几乎任何设置error_bubbling。子表单(字段nameTranslations)根本没有得到验证。

子表单:

class TranslatableTextType extends AbstractType
{
    private $langs;

    /**
    * {@inheritDoc}
    */
    public function __construct($multilang)
    {
        $this->langs = $multilang->getLangs();
    }

    /**
    * {@inheritDoc}
    */
    public function buildForm(FormBuilder $builder, array $options)
    {
        foreach($this->langs as $locale => $lang)
        {
            $builder->add($locale, 'text', array(
                'label' => sprintf("%s [%s]", $options['label'], $lang),
                'error_bubbling' => true,
            ));
        }
    }

    /**
    * {@inheritDoc}
    */
    public function getDefaultOptions(array $options)
    {
        $constraints = [
            'fields' => [],
            'allowExtraFields' => true,
            'allowMissingFields' => true,
        ];

        foreach($this->langs as $locale => $lang)
        {
            $constraints['fields'][$locale] = new NotBlank();
        }

        $collectionConstraint = new Collection($constraints);

        return [
            'validation_constraint' => $collectionConstraint,
            'label' => '',
            'error_bubbling' => true
        ];
    }

    /**
    * {@inheritDoc}
    */
    public function getParent(array $options)
    {
        return 'form';
    }

    /**
    * {@inheritDoc}
    */
    public function getName()
    {
        return 'translatable_text';
    }
}

主要形式:

$builder->add('nameTranslations', 'translatable_text', [
            'label' => 'Name'
        ]);

在实体中:

/**
 * @var array
 *
 * @Assert\Valid
 * @ORM\Column(type="array")
 */
protected $nameTranslations;

1 个答案:

答案 0 :(得分:0)

我认为你应该使用collection类型而不是自定义类型,或者你的自定义类型应该将集合类型定义为父类。

您可以使用All验证码,如:

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

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