Validation 覆盖/删除Symfony2.5中的服务器端验证
假设我有以下表单生成器buildForm方法:Validation 覆盖/删除Symfony2.5中的服务器端验证,validation,symfony,server-side,Validation,Symfony,Server Side,假设我有以下表单生成器buildForm方法: /** * @param FormBuilderInterface $builder * @param array $options */ public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add( 'travelTime', 'datetime', arra
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add(
'travelTime',
'datetime',
array(
'label' => 'Time',
'date_widget' => 'single_text',
'time_widget' => 'single_text',
'invalid_message' => 'Please enter a valid date and time',
)
)
->add(
'acmeEntity',
'entity',
array(
'label' => 'Acme Entity:',
'class' => 'AcmeBundle:MyEntity',
'expanded' => false,
'multiple' => false,
)
)
}
如何覆盖(或删除)对“acmeEntity”表单字段(仅该字段)的验证,以便在调用时:
$form->handleRequest($request);
$form->isValid();
在控制器中,acmeEntity将不包括在确定$form->isValid()
是否返回true的验证中?我已尝试向字段选项添加约束=>false
,但收到以下错误消息:
Notice: Trying to get property of non-object in /var/www/vendor/symfony/symfony/src/Symfony/Component/Form/Extension/Validator/Constraints/FormValidator.php line 67
有人知道禁用Symfony表单字段服务器端验证的正确方法吗
编辑:
请注意,我不是在寻找如何完全禁用验证。这可以通过添加以下内容来实现:
// Disable form validation
$builder->addEventListener(FormEvents::POST_SUBMIT, function ($event) {
$event->stopPropagation();
}, 900); // Always set a higher priority than ValidationListener
到窗体生成器的底部
相反,我想知道如何完全禁用单个表单字段的验证。谢谢大家,祝你们狩猎愉快 我假设您从
MyEntityType
扩展AbstractType
调用buildForm()
,因此只需使用选项解析器,在您的类型中添加函数setDefaultOptions()
,如symphony文档中所述
您可以为您的实体定义一个验证组,并使用'validation\u groups'=>false
。这应仅禁用此字段的验证
自定义表单类型可能如下所示:
// .../Your/OwnBundle/Form/Type/AcmeEntityType.php
namespace Acme\DemoBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class AcmeEntityType extends AbstractType
{
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'validation_groups' => false
));
}
public function getParent()
{
return 'entity';
}
public function getName()
{
return 'acme_entity';
}
}
然后,您可以使用:
$builder
->add(
'travelTime',
'datetime',
array(
'label' => 'Time',
'date_widget' => 'single_text',
'time_widget' => 'single_text',
'invalid_message' => 'Please enter a valid date and time',
)
)
->add(
'acmeEntity',
'acme_entity',
array(
'label' => 'Acme Entity:',
'class' => 'AcmeBundle:MyEntity',
'expanded' => false,
'multiple' => false,
)
)
}
你可以试试这个,我以前用过:
这不起作用--您必须添加:
$builder->addEventListener(FormEvents::POST_SUBMIT,函数($event){$event->stopPropagation();},900)如果要完全删除对所有字段的验证,请在表单生成器底部的“代码>”。请注意,我只是在寻找完全禁用单个字段的方法。acmeEntity如何有效或无效?是否要将该选择与acme实体自动保存?我的意思是,在提交表单时,自动将acme实体值与其他映射字段一起保存到数据库中?我使用JavaScript方法以迫在眉睫的截止日期的名义手动更新select选项值,但此解决方案是正确的。谢谢你,先生。如果我能帮点忙,我很高兴。
$builder
->add(
'travelTime',
'datetime',
array(
'label' => 'Time',
'date_widget' => 'single_text',
'time_widget' => 'single_text',
'invalid_message' => 'Please enter a valid date and time',
)
)
->add(
'acmeEntity',
'acme_entity',
array(
'label' => 'Acme Entity:',
'class' => 'AcmeBundle:MyEntity',
'expanded' => false,
'multiple' => false,
)
)
}