我在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.
问题是我不想将验证层叠到订阅实体.我只希望能够从下拉列表中选择实体.
任何想法?
解决方法:
之所以收到这些错误消息,是因为您在子实体的一个或多个属性上的类型验证失败.无论您在何处定义这些约束,都应进行检查.就我而言,当我为允许为NULL的属性分配“ Type()”约束时,就会触发此错误.删除类型约束消除了错误.
关于子对象的验证,仅当您根据我对文档的阅读情况,在父类中的属性上分配“有效”约束时,才应该发生这种情况.但是,它似乎也由相关的AbstractType表单类型类的setDefaultOptions()方法中定义的级联_验证字段控制,您也可以在实例化表单对象时通过$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
}
// ...
}
Reference documentation on symfony2 validation