Symfony表单 - 如何在验证时添加一些逻辑

时间:2014-06-12 20:11:29

标签: php forms validation symfony symfony-forms

我有一个用于课程订阅的表单,其中我有2个实体字段,活动和etudiant。如果我已经预订的培训师(我可以通过实体活动在DB中找到的信息),我不想验证此表格。 如何(在哪里......)我可以添加一些逻辑指令来控制这个表单的验证? 有人有想法吗?铅?没有Symfony(对我来说)会这么简单!... 感谢

class InscriptionType extends AbstractType
{
        /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('activiteId', 'entity',
                array('label'=>'Activité',
                'attr'=>array('class'=>'form-control'),
                'class'=>'AssoFranceRussie\MainBundle\Entity\Activite',
                'property'=>'nomEtNiveauEtJour',
                ))
            ->add('etudiantId', 'entity',array('label'=>'Etudiant',
                'attr'=>array('class'=>'form-control'),
                'class'=>'AssoFranceRussie\MainBundle\Entity\Etudiant',
                'property'=>'NomEtPrenom',
                ))
        ;
    }

2 个答案:

答案 0 :(得分:1)

您可以通过扩展Symfony验证类来编写自己的约束和验证器。

您需要扩展Symfony\Component\Validator\Constraint以定义约束,并Symfony\Component\Validator\ConstraintValidator来定义验证代码。

也可能有其他方法可以做到这一点,但这可以让您完全控制验证。

答案 1 :(得分:1)

你可以用这种方式做你想做的事:

1-您需要一个变量来将EntityManager存储在InscriptionType类中:

protected $em;

public function __construct($em) {
    $this->em = $em;
}

2-将实体管理器从控制器传递给FormType类,如下所示:

new InscriptionType( $this->getDoctrine()->getManager() );

3-在setDefaultOptions函数中添加你想要的逻辑,以指定validation_groups你想要的表单:

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $p = $this->em->getRepository('YourBundle:YourEntity')->find(1);

    if($p){
      $resolver->setDefaults(array(
        'data_class' => 'YourBundle\Entity\YourEntity',
        'validation_groups' => array('myValidation1'),
        'translation_domain'=>'custom'
      ));
    }
    else{
      $resolver->setDefaults(array(
        'data_class' => 'YourBundle\Entity\YourEntity',
        'validation_groups' => array('myValidation2'),
        'translation_domain'=>'custom'
      ));
    }

}

4-在您的实体中,您需要为实体的字段指定验证组:

/**
 * @var string
 *
 * @ORM\Column(name="name", type="string", length=255)
 * @Assert\NotNull(groups={"myValidation1"})
 */
private $name;

/**
 * @var date
 *
 * @ORM\Column(name="start", type="date")
 * @Assert\NotNull(groups={"myValidation1", "myValidation2"})     
 * @Assert\Date()
 */
private $start;

在这种情况下,在两种情况下都会验证字段'start',但只有myValidation1的第一个字段才是要验证的组。

通过这种方式,您可以控制要验证的字段。