在 symfony 2 中将验证组设置为嵌入表单

Posted

技术标签:

【中文标题】在 symfony 2 中将验证组设置为嵌入表单【英文标题】:set validation group to embedded forms in symfony 2 【发布时间】:2013-09-15 09:13:18 【问题描述】:

如何在嵌入式表单中设置验证组? 我有两个实体 A 和 B 以及每个实体的表单(FormA,FormB) 我将 FormA 嵌入 FormB 中

class FormB extends AbstractType 
    public function buildForm(FormBuilderInterface $builder, array $options) 
        $builder->add('A', new FormA());
    
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
        $resolver->setDefaults(array(
            'data_class' => 'Acme\TestBundle\Entity\B',
            'validation_groups'=>function(FormInterface $form) 
                // set validation group for FormA here
             ,
            'cascade_validation'=>true
        ));
    

FormB如何设置FormA的验证组?

【问题讨论】:

【参考方案1】:

对我有用

class FormB extends AbstractType 
    public function buildForm(FormBuilderInterface $builder, array $options) 
        $builder->add('A', new FormA(), array('validation_groups' => array('yourValidationGroup')));
    
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
        $resolver->setDefaults(array(
            'data_class' => 'Acme\TestBundle\Entity\B',
            'cascade_validation'=>true
        ));
    

还可以在 FormB->setDefaultOptions 中定义验证组。它将验证组应用于所有子表单。

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
        $resolver->setDefaults(array(
            'data_class' => 'Acme\TestBundle\Entity\B',
            'cascade_validation'=>true,
            'validation_groups' => array('yourValidationGroup')
        ));
    

要根据基础数据使用它,您可以将该代码放在事件侦听器上:

public function buildForm(FormBuilderInterface $builder, array $options) 
    $builder->addEventListener(
            FormEvents::POST_SET_DATA,
            function(FormEvent $event) 
                $form=$event->getForm();
                /**
                 * @var ContactDetail $detail
                 */
                $entity=$form->getData();
                if($entity->getA()->isRequired())
                    $form->add('A', new FormA(), array('validation_groups' => array('yourValidationGroup')));
                 else 
                    $form->add('A', new FormA(), array());
                
            
    );

【讨论】:

我希望在关闭验证组时这样做,因为我需要根据某些表单元素值添加验证组 我添加了一个示例,该示例使用 EventListeners 根据基础数据添加组验证。 我正在尝试$builder->add('A', new FormA(), array('validation_groups' => array('yourValidationGroup')));,但对我不起作用...但是将validation_groups 放入默认选项有效...您知道为什么第一次尝试不起作用吗?【参考方案2】:

属性cascade_validation 是deprecated in Symfony 2.8,将在 Symfony 3.0 中删除。要使用cascade_validation,您应该使用@Assert\Valid constraint。

class Profile

  /**
   * @var Address
   * 
   * @Assert\Valid()
   */
  private $address;

附:注意:链接提供给 Symfony 2.8 版本。

【讨论】:

以上是关于在 symfony 2 中将验证组设置为嵌入表单的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2 - 验证不适用于嵌入式表单类型

Symfony 2. 如何为实体的嵌入表单设置默认值?

Symfony2 Doctrine ODM 嵌入类表单验证

验证组不适用于表单

Symfony 2 使用一对多数据库关系的嵌入式表单

将重音字符 é 插入 Symfony2 中的表单时,如何在 mysql 数据库中将重音字符 é 保存为 é?