Symfony 2形成级联验证

时间:2014-03-23 15:26:46

标签: php validation symfony symfony-forms symfony-2.3

我在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.

问题是我不想将验证级联到Subscription实体。我只想从下拉列表中选择实体。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您收到这些错误消息的原因是您在子实体的一个或多个属性上进行了类型验证失败。无论您在何处定义它们,都要检查这些限制。就我而言,当我分配了一个" Type()"对允许为NULL的属性的约束。删除类型约束消除了错误。

关于子对象的验证,这应该仅在您分配"有效"基于我对文档的阅读,对父类中的属性进行约束。但是,它似乎也受相关cascade_validation表单类型类的setDefaultOptions()方法中定义的AbstractType字段控制,您也可以通过{{$options传递它来覆盖它。 1}}实例化表单对象时的数组:

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

在您的情况下,您定义的cascade_validation设置仅适用于表单对象的订阅子项的属性,我认为您尝试将验证设置应用于class本身(具有Subscription对象作为其属性之一的类)。因此,将表单构建器实例更改为:

$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
    }

    // ...
}

Reference documentation on symfony2 validation

答案 1 :(得分:0)

只需点击“此值应为整数类型”。在实体领域出错。原来是一个糟糕的验证器。查看实体类中的验证,特别是任何整数类型验证器,并确保它们的验证确实应该是整数类型。

在我的情况下,关于属性的错误文档导致我错误地对属性应用整数类型验证约束,而实际上它是为了保存对象而设置的。我认为这个实体类验证会在实体字段中启动,因为您在技术上提交整个实体 - 而不仅仅是对它的引用。因此,如果存储在所选实体中的数据与实体类的验证器所需的数据不匹配,则会出现错误。

修复你的实体类的验证器,你应该好好去。