【问题标题】:How to validate subforms of an entity-mapped form in Symfony2?如何在 Symfony2 中验证实体映射表单的子表单?
【发布时间】:2013-01-11 18:47:54
【问题描述】:

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

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

我在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;

【问题讨论】:

  • 这个问题在更多的 symfony 版本中得到修复。我认为这是 2.0 中的一个错误。

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


【解决方案1】:

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

您可以使用All 验证器,例如:

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

它会检查每个数组值是否不为空。

【讨论】:

  • 它不太适合集合,有(大部分时间)固定数量的字段。此外,我在另一个领域也遇到了完全相同的问题——即使我想也无法将其转换为集合。我不明白为什么 symfony 不验证子表单,因为它的每个字段都有一个验证器,并且这个子表单附加到的字段也有验证器 (ORM\Validate)。即使您的解决方案有效(现在无法测试,回到家中),它也会验证整个子表单 - 如果每个字段都单独处理(UX)会更好。
  • symfony.com/doc/master/reference/forms/types/… 那为什么默认情况下不验证子表单...我不明白为什么固定数量的字段不适合集合类型...集合类型应该在你想要的时候使用许多子表单(类型)...顺便说一句,即使您不使用集合,您也可以通过 All 约束来验证这一点
  • 来自cascade_validation除了使用此选项,您还可以在模型中使用 Valid 约束来强制验证存储在属性上的子对象。 已经尝试过Valid 约束。就收藏争议而言 - 我不能将收藏用于具有相同问题的其他领域。 Collection 并不适合很多领域,感觉更像是解决方法而不是解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
  • 2015-02-27
  • 2015-11-03
  • 2015-08-20
相关资源
最近更新 更多