Каскадная проверка формы Symfony 2


У меня есть форма в symfony 2, например:

$form = $this->createFormBuilder();

        $form
            ->add('subscription', 'entity', array(
                'class' => 'AcmeDemoBundle:Subscription',

                'property'              => 'name',
                'label'                 => 'Subscription',
                'cascade_validation'    => false,
                'constraints'           => array(
                    new NotBlank(),
                )
            ))

Это сбой проверки с ошибкой:

subscription: ERROR: This value should be of type integer. ERROR: This value should be of type integer.

Проблема в том, что я не хочу каскадировать проверку для объекта подписки. Я просто хочу иметь возможность выбрать объект из выпадающего списка.

Есть идеи?

Author: jribeiro, 2014-03-23

2 answers

Причина, по которой вы получаете эти сообщения об ошибках, заключается в том, что вы не выполнили проверку типа одного или нескольких свойств дочерней сущности. Просмотрите эти ограничения, где бы вы их ни определили. В моем случае эта ошибка была вызвана, когда я назначил ограничение "Тип()" для свойств, которым было разрешено быть НУЛЕВЫМИ. Устранение ограничений типа устранило ошибки.

Что касается проверки дочерних объектов, это должно происходить только тогда, когда вы назначаете "Допустимое" ограничение для свойство в родительском классе, основанное на моем прочтении документации. Однако, похоже, что он также управляется полем cascade_validation, определенным в методе setDefaultOptions() соответствующего класса типа формы AbstractType, который вы также можете переопределить, передав его через массив $options во время создания экземпляра объекта формы:

$form = $this->createForm(
    $formType,
    $formModel,
    array('cascade_validation' => false)
);

В вашем случае параметр cascade_validation, который вы определили, применяется только к свойствам дочернего элемента подписки вашего объекта формы, где, я думаю, вы пытаетесь применить настройка проверки для самого класса (класса, который имеет объект подписки в качестве одного из своих свойств). Поэтому измените экземпляр конструктора форм на этот:

$form = $this->createFormBuilder(null, array('cascade_validation' => false));

В качестве альтернативы вы можете явно определить поля, которые вы хотите проверить в контроллере, как показано в документации symfony2 следующим образом:

use Symfony\Component\Validator\Constraints\Email;

public function addEmailAction($email)
{
    $emailConstraint = new Email();
    // all constraint "options" can be set this way
    $emailConstraint->message = 'Invalid email address';

    // use the validator to validate the value
    $errorList = $this->get('validator')->validateValue(
        $email,
        $emailConstraint
    );

    if (count($errorList) == 0) {
        // this IS a valid email address, do something
    } else {
        // this is *not* a valid email address
        $errorMessage = $errorList[0]->getMessage();

        // ... do something with the error
    }

    // ...
}

Справочная документация по проверке symfony2

 3
Author: Haig Bedrosian, 2014-09-10 18:50:12

Просто нажмите "Это значение должно иметь тип integer". ошибаюсь в поле сущности. Оказался плохим валидатором. Посмотрите на проверку, которую вы получили внутри класса вашей сущности, в частности, на любые валидаторы целочисленных типов, и убедитесь, что то, что они проверяют, действительно должно иметь тип integer.

В моем случае плохая документация по свойству привела к тому, что я ошибочно применил ограничение проверки целочисленного типа к свойству, когда на самом деле оно было настроено для хранения объекта. Я думаю эта проверка класса сущностей начинается с полей сущностей, потому что вы технически отправляете всю сущность, а не только ссылку на нее. Таким образом, если данные, хранящиеся в выбранной сущности, не соответствуют требованиям валидаторов класса сущностей, вы получите сообщение об ошибке.

Исправьте валидаторы вашего класса сущностей, и вы должны быть готовы к работе.

 0
Author: chrisolof, 2015-04-29 20:34:10