Symfony 2表单级联验证

3

I have a form in symfony 2 like:

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

问题是我不想将验证级联到订阅实体。我只想能够从下拉菜单中选择实体。
有什么建议吗?
2个回答

3
您收到这些错误消息的原因是由于您在子实体的一个或多个属性上未通过类型验证。请查看您定义约束的任何位置。在我的情况下,当我对允许为空的属性分配“Type()”约束时触发了此错误。移除类型约束将消除错误。
关于子对象的验证,根据我的文档阅读,这应该只会在您在父类中的某个属性上分配“Valid”约束时发生。但是,这似乎也由相关的AbstractType表单类型类的setDefaultOptions()方法中定义的cascade_validation字段控制,您还可以通过在实例化表单对象时通过$options数组传入来覆盖它:
$form = $this->createForm(
    $formType,
    $formModel,
    array('cascade_validation' => false)
);

在您的情况下,您定义的cascade_validation设置仅适用于表单对象的Subscription子属性,在那里我认为您正在尝试将验证设置应用于类本身(该类具有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
    }

    // ...
}

Symfony2验证的参考文档


0

在实体字段中遇到了"This value should be of type integer."错误。最终发现是验证器出了问题。查看一下实体类中的验证,特别是任何整数类型的验证器,并确保它们所验证的内容确实应该是整数类型。

在我的情况下,属性文档不正确,导致我错误地将整数类型验证约束应用于该属性,而实际上它被设置为保存对象。我认为这个实体类验证会在实体字段上触发,因为你技术上是提交整个实体——而不仅仅是对它的引用。因此,如果所选实体中存储的数据与实体类的验证器要求的内容不匹配,就会出现错误。

修复实体类的验证器,你就可以顺利进行了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接