проверка формы symfony не работает

#forms #validation #symfony #constraints #formbuilder

#формы #проверка #symfony #ограничения #formbuilder

Вопрос:

У меня есть такая форма в моем проекте symfony, обратите внимание, что соответствующее поле не является отображенным:

 <?php

namespace MyAppMyBundleForm;

use SymfonyComponentFormAbstractType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentOptionsResolverOptionsResolverInterface;

// validators and constraints
use SymfonyComponentValidatorConstraintsLength;

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 amp;amp; $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' => 'MyAppMyBundleEntityArtist',
            '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. В вашем коде нет ничего плохого. Ограничение проверки должно работать нормально. Используете ли вы какие-либо группы проверки?

2. @MikhailProsalov спасибо за ваш комментарий, нет, я здесь не использую группу проверки.

3. Пожалуйста, попробуйте добавить ‘mapped’ => false в массив параметров поля artistNumber.

Ответ №1:

У вас есть условие перед добавлением ограничения. Проверьте, выполняется ли условие

 $artist amp;amp; $artist->getProfessional()
  

верно, как вы предполагаете

Комментарии:

1. действительно, это хорошее предложение, но я проверяю, $artist amp;amp; $artist->getProfessional() верно ли значение, как я предполагал, и да, это так, поэтому я не думаю, что проблема в условии.