symfony表单验证不起作用

时间:2016-10-18 15:26:12

标签: forms validation symfony constraints formbuilder

我的symfony项目中有这样的表格,请注意相关字段不是映射的字段:

<?php

namespace MyApp\MyBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

// validators and constraints
use Symfony\Component\Validator\Constraints\Length;

class ArtistWithConstraintType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $artist = $options['data'];
        $builder
            ->add('professional', 'choice', array(
                    'expanded' => true,
                    'multiple' => false,
                    'choices' => array(false => 'You are a self-educated', true => 'You are a professional'),
                    'required' => true,
                ))
            ;

        if ($artist && $artist->getProfessional()) {
            $builder->add('artistNumber', 'text', array(
                'constraints' => array(
                                    new Length(array(
                                        'max' => 14,
                                        'min' => 14))),
                'required' => true,
                ))
            ;
        } else {
            $artist->setArtistNumber(null);
            $builder->remove('artistNumber')
            ;
        }
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
      $resolver->setDefaults(array(
            'data_class' => 'MyApp\MyBundle\Entity\Artist',
            'csrf_protection' => true,
            'csrf_field_name' => '_token_artist',
            // a unique key to help generate the secret token
            'intention'       => 'artist_item',
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'app_artist';
    }
}

事实上,在这种形式下,我问艺术家是否是专业人士。如果没有,则无需采取任何措施如果为true,则通过ajax方法显示名为artistNumber的字段。

目前,一切运作良好。除验证约束外:

'constraints' => array(
    new Length(array(
        'max' => 14,
        'min' => 14))),

实际上,artistNumber字段必须是一个只有14个字符的字符串,不多也不少。但是当我验证表单时,不会考虑此验证约束。

我在视图中显示表单没有问题,ajax没问题或者没有问题来恢复artistNumber字段中的用户条目。但是,如果用户输入长度小于或大于14个字符的字符串,则验证也不起作用,即使用户输入少于或超过14个字符,我也会在用户输入后恢复。

我在哪里错了?

1 个答案:

答案 0 :(得分:0)

在添加约束之前有条件。检查条件是否

$artist && $artist->getProfessional()
当你正在使用时,

是正确的