Symfony 2形成条件必填字段,字段未映射到实体

时间:2015-01-30 10:07:21

标签: forms validation symfony

我的表单只有在选择了conditionalRequiredField时才需要字段requireField

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add(
            'requireField', 'choice', array
            (
                'label' => ' ',
                'mapped' => false,
                'choices' => array
                (
                    'require' => 'Should I require that field?'
                ),
                'multiple' => true,
                'expanded' => true
            )
        )
        ->add(
            'conditionalRequiredField', 'text', array
            (
                'label' => 'I am required because the field above was selected',
                'class' => 'AppBundle\Entity\SomeEntity',
            )
        )

......以及其他一些字段,其中一些字段映射到实体。

第一个字段未映射到实体。因此,在控制器中,当我访问$form->getData()时,它不可用,它只能通过Request对象获得。现在的问题是,我应该如何以及在哪里添加验证才能正确完成?要使用isValid()方法验证整个表单,在其他地方没有任何其他逻辑?我可能会在某处使用验证,但感觉不对。我已经阅读了很多关于约束和验证器的内容,但它们似乎都与实体字段相关联。

感谢您的帮助: - )。

1 个答案:

答案 0 :(得分:1)

想象一下,与此FormType相关联的实体是MyEntity

你可能应该有这样的事情:

/**
 * @My\CustomValidation
 */
class MyEntity
{
    private $requiredField;

    /**
     * @ORM\Column(type="string")
     */
    private $conditionalRequiredField;
}

为了创建自定义验证,您可以查看http://symfony.com/doc/current/cookbook/validation/custom_constraint.html#class-constraint-validator以创建类别约束验证器

你验证方法将如下所示:

public function validate($entity, Constraint $constraint)
{
    if(!$entity instanceof MyEntity){
        return;
    }

    if($entity->getRequiredField() && $entity->getConditionalRequiredField() == null) {
        $this->context->addViolationAt('conditionalRequiredField', 'you.error.flag', array(), null);
    }
}